Leetcode.476. 数字的补数---位运算

476. 数字的补数

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。

示例 1:

输入:num = 5
输出:2
解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。
示例 2:

输入:num = 1
输出:0
解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
 

提示:

1 <= num < 231

题解:

  • 我们不能直接通过位运算符~来对数字进行取反,因为前导0不用取反,因此我们可以遍历二进制位数,为了避免不判断前导零,我们可以从高位向低位去遍历,对于前导零均不做操作;一旦前导零出现完全后,我们就要开始执行取反的操作,这里为了避免对前导零取反,我们使用逐位取反即可。
  • 这里我是设置一个变量保留每次取反的数字,并对其进行叠加,使其接收到所有位取反后的值。

代码:

class Solution {
    
    
    public int findComplement(int num) {
    
    
        int count = 0;
        boolean flag = true;
        for(int i=31;i>=0;i--){
    
    
            if((((num>>i) & 1) ^ 1) == 1 && flag){
    
    
                continue;
            }

            if((((num>>i) & 1) ^ 1) == 0){
    
    
                flag = false;
                count = (count | ((((num>>i) & 1) ^ 1)<<i));  
                //num右移i位在后面叠加的过程还要移回来,因为开始右移只是为了取反而已
            }
            else{
    
    
                count = (count | ((((num>>i) & 1) ^ 1)<<i));
            }
        }

        return count;
    }
}

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/121086649
今日推荐