x&(-x)如何理解

“x&(-x)”这个式子是在看树状数组用法的时候看到的。那篇文章里说“x&(-x)”的作用是求x的“最低非零位”(lowbit)。一看到“最低非零位”,以为这个式子的结果是“位数”,但并不是。比如,0100B的最低非零位是从右往左第3位,我原本以为这个式子的结果是3,但其实它的结果是0100。

这个式子怎么理解呢?要理解这个式子,首先需要理解“补码”的概念。我之前对补码的“理解”,仅限于知道一个数的补码怎么求,但是却不知道计算机中为何要用补码来表示负数。

首先来回答这个问题:计算机中的数为什么要用补码来表示?

答:为了电路设计方便。计算机做减法和加法的实质其实是一样的,都是做加法——补码相加。(乘法的实质是加法和移位,除法没有了解过。)

如何感性的理解补码?

答:与补码对应的概念是“模N运算”。下面用一个例子解释什么是模N运算

例子:我们现在有一块手表,时针顺时走一格用“走了+1步”表示,逆时针走一格用“走了-1步”表示。现在时针指向3点,我们让时针“走-1步”,它会指向两点。我们让时针“走+11步”,它还是会指向两点。此时的表盘其实就是一模12运算系统,其中-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12的补码分别是11,10,9,8,7,6,5,4,3,2,1,0。1和11互为补码,意思就是,正走1步和负走11步的效果相同,正走11步和负走1步的效果也相同。读到这里,大家也可以发现,互为补码的两个数相加,结果为0(严格地说应该还有个进位,如0000 0001 + 1111 1111 = 1 0000 0000,由于运算系统只有8位,所以进位被忽略),其实并不是偶然,而是有原因的。

而计算机是模2^N运算系统,其中N是计算机的位数。书上举得一般都是N=8时的例子,这是计算机是个模256运算系统,用感性去理解的话,也可以把它理解为一个表盘,但是这个表盘不是从1到12,而是从1000000B(-128)到0111111B(127)。+1表示顺时针走一步,-1表示逆时针走一步。逆时针走1步与顺时针走255的效果相同,因此-1的补码是11111111B(255)。

由上述介绍可以知道,如果有一套减法电路,负数其实可以只用标志位表示,不用补码表示也可以,如-1的二进制表示为10000001B,而不必用11111111B。

读到这里,标题中的问题应该就不难回答了。x和(-x)在计算机中的表示码互为补码,如x=00001010时,-x=11110110。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值