476. Number Complement
链接
题意
给定一个正整数,输出它取反后的十进制数
注意:
- 给定的正整数在32个字节范围内
- 正整数的二进制表示没有前导0(即5表示为101,前面不加0)
思路
不能直接对给定数取反,因为要从最高位的1开始向后按位取反
代码
C:
// 逐位取反
#include <math.h>
int findComplement(int num) {
int ans = 0;
int i = 0;
while(num) {
ans += (!(num & 1) * pow(2.0, i++));
num >>= 1;
}
return ans;
}
Java:
/**
* 构造一个和给定数位数相等的掩码(mask-1后每一位都是1)
* 然后对num进行异或操作(即按位取反)
*/
public class Solution {
public int findComplement(int num) {
int mask = 1;
int t = num;
while(t > 0) {
mask <<= 1;
t >>= 1;
}
return num^(mask-1);
}
}