一个数如何只保留二进制位的最后一个 1 以及后边的 0,【补码的解释】

方法:

让这个数与自身的负数按位与,结果就是。

int lowbit(int x){
    return x & (-x);
}

解释:

  1. 计算机中采用补码表示一个数,负数的补码可以通过对应正数原码取反再加一得到,假设 x = 9,对应的原码为 0000 1001 (假设用 8 位存储),对应的补码为 1111 0110 + 1 = 1111 0111。
  2. 正数的补码与原码一致(后边有补充介绍补码)
  3. 所以 x & (-x) = 9 & (-9) = 0000 1001 & 1111 0111 = 0000 0001,只保留了最后一个1,以及后边的0。

补充:

补码

补码表示的值的计算逻辑: 最高位认为是负数,其他位均为整数,每位代表 2 的该位置的幂,举例如下:

  1. 101100 (使用 6 位 2 进制表示)= - 25 + 23 + 22 = - 32 + 8 + 4 = 20;
  2. 如果用更多位表示 - 20, 只需要在左边补充 1 即可,比如:1110 1100 (用 8 位表示)= - 2 7 + 26 + 25 + 23 + 22 = - 128 + 64 + 32 + 8 + 4 = - 20;
  3. 可以使用同样的计算逻辑来计算正数补码的值,比如:01 0100(使用 6 位 2 进制表示)= - 25 * 0 + 24 + 22 = 16 + 4 = 20;
  4. 如果用更多位表示 20, 只需要在左边补充 0 即可

参考:

  1. [1.2.12 Worked Examples: Two’s Complement Representation]: https://www.youtube.com/watch?v=m_G3z-C1C2g
  2. 【位运算】深入理解并证明 lowbit 运算: https://blog.csdn.net/lesileqin/article/details/102418143
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值