476. 数字的补数
给你一个 正 整数 num
,输出它的补数。补数是对该数的二进制表示取反。
示例 1:
输入:num = 5
输出:2
解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。
示例 2:
输入:num = 1
输出:0
解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
提示:
- 给定的整数
num
保证在 32 位带符号整数的范围内。 num >= 1
- 你可以假定二进制数不包含前导零位。
题解:
class Solution {
public int findComplement(int num) {
int x = 1; //与1进行与操作
int pow = 0; //二进制从低到高的每一位,从最低位0开始
int ans = 0;
while(num > 0) {
//按位与进行比较,如果为0,说明该位置的值为1,则我们将该位置补码对应的值添加到结果集中
if((num & x) == 0) {
ans += Math.pow(2,pow);
}
//位数增加1
++pow;
num = num >> 1;
}
return ans;
}
}
优化代码:我们可以将pow直接定义为1,然后每高一位,直接进行乘以2的记录操作
class Solution {
public int findComplement(int num) {
int x = 1; //与1进行与操作
int pow = 1; //二进制从低到高的每一位,从最低位0开始
int ans = 0;
while(num > 0) {
//按位与进行比较,如果为0,说明该位置的值为1,则我们将该位置补码对应的值添加到结果集中
if((num & x) == 0) {
ans += pow;
}
//位数增加1,即进行乘以2的操作
pow *= 2;
num = num >> 1;
}
return ans;
}
}