LeetCode 1009. 十进制整数的反码(位运算)

2020-07-13 15:13:31 浏览数 (1)

1. 题目

每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 “101”,11 可以用二进制 “1011” 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。

二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 “101” 的二进制反码为 “010”。

给定十进制数 N,返回其二进制表示的反码所对应的十进制整数。

2. 解题

  • 求出二进制的非零位数,再用32减去它,左移这么多位(高位没了),取反(结果 111…),再右移这么多位(末位的111…去掉了)
代码语言:javascript复制
class Solution {
public:
    int bitwiseComplement(int N) {
        if(N == 0) return 1;
        int bits = 32, Nc = N;
        while(Nc)
        {
        	bits--;
        	Nc >>= 1;
        }
        return ~(N << bits) >> bits;
    }
};

一个数和它的反码之和等于

2^n-1,quad n表示二进制位数
代码语言:javascript复制
class Solution {
public:
    int bitwiseComplement(int N) {
        if(N == 0) return 1;
        int bits = 0, Nc = N;
        while(Nc)
        {
        	bits  ;
        	Nc >>= 1;
        }
        return (1 << bits) - 1 - N;
    }
};

0 人点赞