如何求一个数的补数

  • Post author:
  • Post category:其他


发现了一个问题自己还不是很懂,就是说如何求一个数的补数,举个例子,比如5,二进制是101,那么它的补数就应该是010就是2。

你可能会问了,这不是很简单吗?取反就行了啊,~5就行,事实上是这样子吗?当然不是了,因为5是101,但是它前边还有很多0。

如果按照无符号int来看的话,是32个bit。

为了简单,我们只写最后8个bit,是

0000 0101

那么它的补数2就是

0000 0010。

但是对5取反之后得到的是:

11111010

显然,取反是错误的。那么怎么做才是对的呢?

偷偷瞄了一眼答案。


第一步:寻找一个掩码(mask)


要找的这个掩码的特征应该是这个样子的。5的二进制是101,只占3个bit,那么这个掩码的最后3个bit要是0,其余全部是1。如下所示:

5:0000 0101

掩码:1111 1000


第二步:分别取反


~5 :1111 1010

~掩码:0000 0111


第三步:相与


~5 & ~掩码 = 0000 0010


代码如下:

class Solution {
public:
    int findComplement(int num) {
        unsigned mask = ~0; //掩码初始为二进制全部是1
        while(num & mask)
            mask <<= 1;  //左移掩码
        return ~num & ~mask;
    }
};

特此记录,谨防忘记



版权声明:本文为u012351768原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。