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:
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. 使用原码进行运算时,符号位需要单独处理
反码只是作为补码和原码之间的桥梁
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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);
}
}
太丑陋了!!!!
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;
}
}