方法一:
使用异或运算
例如 5(101) 补数(010)2
2 = 5^7
010 = 101^111
所以只需再原数的基础上构造出一个长度相同的全一数,在进行异或操作
//构造一个和num二进制表示位数相同的全一2进制数
while(tmp>0){
AllOne = AllOne<<1;
tmp = tmp>>1;
}
AllOne = AllOne-1;
class Solution {
public int findComplement(int num) {
int AllOne = 1,tmp = num;
//构造一个和num二进制表示位数相同的全一2进制数
while(tmp>0){
AllOne = AllOne<<1;
tmp = tmp>>1;
}
AllOne = AllOne-1;
return num^AllOne;
}
}
可以利用 Java 的 Integer.highestOneBit() 方法来获得含有首 1 的数。
public int findComplement(int num) {
if (num == 0) return 1;
int mask = Integer.highestOneBit(num);
mask = (mask << 1) - 1;
return num ^ mask;
}
方法二:
Cs-Nodes
public int findComplement(int num) {
int mask = num;
mask |= mask >> 1;
mask |= mask >> 2;
mask |= mask >> 4;
mask |= mask >> 8;
mask |= mask >> 16;
return (mask ^ num);
}