每个非负整数 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 。
思路:观察到问题本质是反转位,可以直接和1进行异或操作,0异或1得1,1异或1得0,这样就可以做到对每一位上的数字反转。那么,我们首先需要创建一个和原数表示位数相同的,各位全为1的数,因此我们先统计出原数在计算机内存中占用的位数,然后将1左移位对应的位数并-1,则对应的是在无符号的情况下的当前位数所能表示的最大数,与原数异或返回最终答案。注意考虑原数为0的情况,这种情况我们写的统计位数的循环是不进入的,需要做特殊处理,直接返回1。
解:
int
bitwiseComplement(
int
N){
if
(N==
0
)
return
1
;
int
i,n,count;
long
long
sum;
for
(n=N,count=0;n!=
0
;n>>=
1
) ++count;
for
(i=
0,sum=1
;i
1
;
return
N ^ (sum-
1
);
}
更简单的(只要新的全1数和原数位数相等即可,位数具体是多少位并不重要):
int
findComplement(
int
num){
if
(num==
0
)
return
1
;
long
long
temp =
1
;
while
(num >= temp) temp <<=
1
;
return
((temp-
1
) ^ num);
}