题目来源
我想着每次检查一位是否为0,是的话就加上对应的值。
class Solution {
public:
int findComplement(int num) {
int add = 1, res = 0;
while (num) {
if (((num >> 1) << 1) == num)
res += add;
add <<= 1;
num >>= 1;
}
return res;
}
};
然后想想应该可以用异或来实现,就是先看这个数有几位,然后拿一个这么多位的全为1的数异或一下,就得到结果。但是实现起来有点问题。
巧妙的地方是设置一个全1,然后不断左移并且和num与操作,来判断num一共有多少位。
class Solution {
public:
int findComplement(int num) {
unsigned mask = ~0;
while (mask & num)
mask <<= 1;
return ~mask ^ num;
}
};