数字的补数 -- LeetCode -- 10.18

数字的补数

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

  • 例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。

给你一个整数 num ,输出它的补数。

 

示例 1:

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

自己的题解(朴实无华):

class Solution {
public:
    int findComplement(int num) {
        int ans = 0;
        long long k = 1;
        while(num){
            ans = ans + abs(num % 2 - 1) *  k;
            num /= 2;
            k *= 2;
        }
        return ans;
    }
};

利用位运算:

  先从高到低遍历,找到最高位 1 的位置。再从低到高取反。

  num >> i :num 二进制数的 第 i 位。

  ans | 1 << i:ans 加上 2^i。

class Solution {
public:
    int findComplement(int num) {
        int s = -1, ans = 0;
        for(int i = 31; i >= 0; i--){
            if(((num >> i) & 1) == 1){
                s = i;
                break;
            }
        }
        for(int i = 0; i < s; i++){
            if(((num >> i) & 1) == 0) ans |= (1 << i);
        }
        return ans;
    }
};

  

 

  

 





posted @ 2021-10-18 22:38  荣荣荣荣荣荣  阅读(146)  评论(0)    收藏  举报