题目:求补数
思路:首先,理解一下
5 --> 101
2 --> 010
5 + 2 = 111
那么已知5,要求5的补数就需要知道111,也就是1000-1(此处为二进制表示)
代码如下
#include <iostream>
#include <unordered_map>
#include <vector>
#include <array>
using namespace std;
class Solution {
public:
int findComplement(int num) {
//i = num + 1 + com(例如 8 = 5 + 1 + 2)写成2进制好看些
int temp = num;
int i = 1;
while(num){
num /= 2;
i *= 2;
}
int res = i - 1 - temp;
return res;
}
};
int main(){
Solution s;
int num = 9;
int re = s.findComplement(num);
cout << re << endl;
system ("pause");
return 0;
}方法2:
这个是参考网上大神写的,一开始有点懵,看不太懂,自己举了个例子,然后写成二进制,一步步地走了一遍后,发现思路很简单
以9为例,9 --> 0000 1001
理想结果 --> 0000 0110
~9 --> 1111 0110
那么就需要~9&num num --> 0000 1111 ~num = 1111 0000(那么想办法得到1111 0000 就好啦)
#include <iostream>
#include <unordered_map>
#include <vector>
#include <array>
using namespace std;
class Solution {
public:
int findComplement(int num) {
int mask = ~0;
while(num & mask)
mask <<= 1;
return ~num & ~mask;
}
};
int main(){
Solution s;
int num = 9;
int res = s.findComplement(num);
cout << res << endl;
system ("pause");
return 0;
}
本文介绍了两种求整数补数的方法:一种通过计算二进制表示下的补数;另一种利用位运算技巧实现。提供了C++代码实现并解释了每种方法的工作原理。
329

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



