方法1:异或法:
public static int bitwiseComplement(int n){
int num = 1;
if(n == 0){
return 1;
}
int temp1 = 1;
int temp2 = n;
while(temp2 > 0){
n ^= temp1;//通过temp1得到某个位的反码,异或时只有temp1中1对应的位置发生改变,其余位置由于是0所以保持不变。
temp1 <<= 1;//调整1的位置
temp2 >>=1;//计数
}
return n;
}
求一个二进制的反码,我们可以让它每一位去和1异或,得到的结果就是对应的反码。比如0000 0101我们让他先和1异或,得到0000 0100;再将1左移一位,继续异或得到0000 0110;以此类推我们就可以得到对应的反码。
方法2:按位与法:
public int bitwiseComplement3(int n) {
if (n == 0) {
return 1;
}
long start = 1;
int sum = 0;
while (start < n) {
if ((n & start) == 0) {
sum += start;
}
start <<= 1;
}
return sum;
}
继续举例来说明原理:比如求0000 0101的反码,首先让它和1按位与得到0000 0001,结果不为0,所以直接将1左移继续和0000 0101按位与得到0000 0000结果为0,此时用一个初始值为0的数sum加上0000 0010得到了0000 0010 。以此类推得到就可以用sum得到反码。
方法3:高位差值法:
public static int bitwiseComplement2(int n){
int temp = 2;
while(temp <= n){
temp <<= 1;
}
return temp - n - 1;
}