题目
每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 “101”,11 可以用二进制 “1011” 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 “101” 的二进制反码为 “010”。
给定十进制数 N,返回其二进制表示的反码所对应的十进制整数。
示例 1:
输入:5
输出:2
解释:5 的二进制表示为 "101",其二进制反码为 "010",也就是十进制中的 2 。
示例 2:
输入:7
输出:0
解释:7 的二进制表示为 "111",其二进制反码为 "000",也就是十进制中的 0 。
示例 3:
输入:10
输出:5
解释:10 的二进制表示为 "1010",其二进制反码为 "0101",也就是十进制中的 5 。
提示:
0 <= N < 10^9
思路
- 首先,关于计算机系统中补码的知识
- 反码就是将二进制位上的每一个0/1对换。
- 正整数的反码会变成负数。因为正整数的最高位是0,反码后就是1.
- 十进制数字10,~10,-10的二进制形式:
数字 | 十进制数 | 二进制 |
---|---|---|
10 | 10 | 1010 |
~10 | -11 | 11111111111111111111111111110101 |
-10 | -10 | 11111111111111111111111111110110 |
- 从题目中我们知道10的反码是0101,正好是~10的后4位。所以我们只要把后4位取出来转化为十进制数字就可以了
- 我们用二进制1111与~10即可得到答案。
代码示例
class Solution {
public int bitwiseComplement(int N) {
if(N ==0) return 1;
int n = ~N;
int pos_sum = 0;
while(N>0){
pos_sum++;
N = N>>1;
}
return n&((int)Math.pow(2,pos_sum)-1);
}
}