如何求一个数的补数

发现了一个问题自己还不是很懂,就是说如何求一个数的补数,举个例子,比如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;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值