对正整数挨个逐位,判断求解
public int bitwiseComplement(int N) {
if (N == 0)
return 1;
int n = 31;
// 找到最大的那个1
while (N >> n == 0) {
n--;
}
// 逐位求解,为0加上,为1减去
int res = 0;
while (n >= 0) {
int t = N >> n;
if (t == 0) {
res += 1 << n;
} else {
N = N - (1 << n);
}
n--;
}
return res;
}
运用程序自带求解
public int bitwiseComplement(int N) {
if (N == 0)
return 1;
// 找到最高位
int n = 30;
while (n > 0) {
if (1 << n <= N) {
break;
}
n--;
}
//对111...111进行异或取值
return N ^ ((1 << (n + 1)) - 1);
}
数学
因为求反码因此,
10101+01010=11111;
先根据位数找到11111,然后减去原值,十分巧妙
public int bitwiseComplement(int N) {
int temp = 2;
while (temp <= N) {
temp = temp << 1;
}
return temp - N - 1;
}