Leetcode476. 数字的补数
思路一:每一位按位取反
要把所有数字取反,我们先找到numnumnum的最高位,将最高位后面的所有位取反即可
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;
}
};
思路二:使用位运算
既然是取反,那么我们想一想可不可以使用位运算来计算呢?
如果我们选择直接取反,那么numnumnum最高位之前的所有位也会被取反,所以我们还是要通过遍历方式找到numnumnum的最高位,为xxx
找到之后,能直接用numnumnum和xxx取&嘛?这样只能得到最高位,因此我们将xxx减一,这样就可以保留numnumnum除最高位后面的所有取反的位数,因为最高位取反一定是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);
}
};
930



被折叠的 条评论
为什么被折叠?



