LeetCode-476 Number Complement
2017-06-04 10:46
295 查看
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.
Note:
The given integer is guaranteed to fit within the range of a 32-bit signed integer.
You could assume no leading zero bit in the integer’s binary representation.
Example 1:
Example 2:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原码、反码、补码的关系:
正数:反码 = 原码。
负数:反码 = 符号位不变,其余位取反。
补码 = 反码+1
补码:计算机中使用的是补码,而不是原码或反码。
为什么使用补码呢?
进行运算时,可以统一加减法(时钟原理、补码概念)。另外可以让符号位作为数值直接参与计算。
为什么不使用原码呢?
1. 使用原码的话,表示0时会出现二义性,[+0]原=00000000,[-0]原=10000000,
2. 使用原码进行运算时,符号位需要单独处理
反码只是作为补码和原码之间的桥梁
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我的方法虽然通过了,但是感觉实在是太丑陋了,耗时29ms。
太丑陋了!!!!
比较好的方法如下,耗时9ms:
(1<<i) & num:找到lead位置
mask:左移leader位于num相与。如果与后结果为0,则表示位与num的位相反,然后与将要返回的结果做或操作,添加的结果的i位。
返回结果。
需要学习的地方:
1. 可用左移与的操作找到leader位。
2. mask的使用
Note:
The given integer is guaranteed to fit within the range of a 32-bit signed integer.
You could assume no leading zero bit in the integer’s binary representation.
Example 1:
Input: 5 Output: 2 Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.
Example 2:
Input: 1 Output: 0 Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原码、反码、补码的关系:
正数:反码 = 原码。
负数:反码 = 符号位不变,其余位取反。
补码 = 反码+1
补码:计算机中使用的是补码,而不是原码或反码。
为什么使用补码呢?
进行运算时,可以统一加减法(时钟原理、补码概念)。另外可以让符号位作为数值直接参与计算。
为什么不使用原码呢?
1. 使用原码的话,表示0时会出现二义性,[+0]原=00000000,[-0]原=10000000,
2. 使用原码进行运算时,符号位需要单独处理
反码只是作为补码和原码之间的桥梁
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我的方法虽然通过了,但是感觉实在是太丑陋了,耗时29ms。
public class Solution { public int findComplement(int num) { int result=0; int count=0; int [] biresult = new int[32]; boolean flag = false; StringBuilder sb = new StringBuilder(); while(a!=0){ result= a%2; System.out.println("result: "+result); biresult[count]=result^1; count++; a=a/2; } if(count ==1){ System.out.println(biresult[count-1]); } if(count >1){ for(int i= count-1;i>=0;i--){ if(!flag && biresult[i] !=0){ flag = true; } if(flag){ sb.append(biresult[i]); } } if(!flag){ sb.append(0); } } return Integer.parseInt(sb.toString(),2); } }
太丑陋了!!!!
比较好的方法如下,耗时9ms:
public class Solution { public int findComplement(int num) { int complementary = 0; int i = 31; while(((1<<i) & num)==0) i--; while(i >= 0){ int mask = (1 << i); int value = mask & num; if(value == 0) complementary |= mask; i--; } return complementary; } }
(1<<i) & num:找到lead位置
mask:左移leader位于num相与。如果与后结果为0,则表示位与num的位相反,然后与将要返回的结果做或操作,添加的结果的i位。
返回结果。
需要学习的地方:
1. 可用左移与的操作找到leader位。
2. mask的使用
相关文章推荐
- LeetCode(476): Number Complement
- LeetCode 476 Number Complement(位运算)
- LeetCode- 476 Number Complement(easy)
- leetcode 476 Number Complement
- LeetCode 476 Number Complement 补数
- 【LeetCode】476 Number Complement
- leetcode 476 Number Complement C++
- leetcode-476- Number Complement
- LeetCode 476 Number Complement
- 刷题的日常[Leetcode]——461)Hamming Distance and 476)Number complement
- leetcode--476--Number Complement(我的解法)
- leetcode 476 Number Complement
- LeetCode_476-Number Complement
- 476. Number Complement
- LeetCode之Number Complement
- 476. Number Complement
- LEETCODE--Number Complement
- 476. Number Complement
- LeetCode - Number Complement
- [LeetCode] Hamming Distance(二进制中有多少个1)+ Number Complement(补码)