image-20211018101215331

解题思路:

​ 这题的解题思路其实比较清晰,就是求二进制然后取反重新计算新数,可以直接在求解二进制的过程中直接得出最终的结果。

​ 以下是C++代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int findComplement(int num) {
//先求出其二进制数
int result=0;
int count=0;
while(num!=0){ //这里因为题目要求其实num/2!=0也可以
int temp=(num%2+1)%2;
result+=pow(2,count++)*temp;
num/=2;
}

return result;
}
};

单看这个可能问题已经解决了,但是题目中想让我们实现的位运算其实并没有做到,在看到一些大佬的题解后,其实还有更简单直接的方法。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int findComplement(int num) {
int temp = num, c = 0;
while(temp > 0){
temp >>= 1;
c = (c << 1) + 1;
}
return num ^ c;
}
};

这里的思路是:求出temp有多少位以后利用得出一个全1的c,再通过num^c(异或)就能得出最终结果,更符合题目的要求。

1
C++运算符优先级参考:https://www.sojson.com/operation/cxx.html