Leetcode476. 数字的补数
思路一:每一位按位取反
要把所有数字取反,我们先找到 n u m num num的最高位,将最高位后面的所有位取反即可
class Solution {
public:
int findComplement(int num) {
int pos;
for (int i = 31; i >= 0; i -- ) {
if (num >> i & 1) {
pos = i;
break;
}
}
int res = 0;
for (int i = 0; i < pos; i ++ )
if ((num >> i & 1) == 0) res |= 1 << i;
return res;
}
};
思路二:使用位运算
既然是取反,那么我们想一想可不可以使用位运算来计算呢?
如果我们选择直接取反,那么
n
u
m
num
num最高位之前的所有位也会被取反,所以我们还是要通过遍历方式找到
n
u
m
num
num的最高位,为
x
x
x
找到之后,能直接用
n
u
m
num
num和
x
x
x取&嘛?这样只能得到最高位,因此我们将
x
x
x减一,这样就可以保留
n
u
m
num
num除最高位后面的所有取反的位数,因为最高位取反一定是0,所以不需要改动
class Solution {
public:
int findComplement(int num) {
int x = 0;
for (int i = num; i != 0; i -= i & -i) x = i;
return ~num & (x - 1);
}
};