二进制世界的秘密( 三 )


 
算数右移和逻辑右移的区别在了解完补数后,我们重新考虑一下右移这个议题,右移在移位后空出来的最高位有两种情况 0 和 1 。当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0,类似于霓虹灯向右平移的效果,这就被称为逻辑右移

二进制世界的秘密

文章插图
逻辑右移示意图
将二进制数作为带符号的数值进行右移运算时,移位后需要在最高位填充移位前符号位的值( 0 或 1) 。这就被称为算数右移 。如果数值使用补数表示的负数值,那么右移后在空出来的最高位补 1,就可以正确的表示1/2,1/4,1/8等的数值运算 。如果是正数,那么直接在空出来的位置补 0 即可 。
下面来看一个右移的例子 。将 -4 右移两位,来各自看一下移位示意图
二进制世界的秘密

文章插图
逻辑右移和算数右移示意图
如上图所示,在逻辑右移的情况下, -4 右移两位会变成 63, 显然不是它的 1/4,所以不能使用逻辑右移,那么算数右移的情况下,右移两位会变为-1,显然是它的 1/4,故而采用算数右移 。
那么我们可以得出来一个结论:左移时,无论是图形还是数值,移位后,只需要将低位补 0 即可;右移时,需要根据情况判断是逻辑右移还是算数右移 。
下面介绍一下符号扩展:将数据进行符号扩展是为了产生一个位数加倍、但数值大小不变的结果,以满足有些指令对操作数位数的要求,例如倍长于除数的被除数,再如将数据位数加长以减少计算过程中的误差 。
以8位二进制为例,符号扩展就是指在保持值不变的前提下将其转换成为16位和32位的二进制数 。将0111 1111这个正的 8位二进制数转换成为 16位二进制数时,很容易就能够得出0000 0000 0111 1111这个正确的结果,但是像1111 1111这样的补数来表示的数值,该如何处理?直接将其表示成为1111 1111 1111 1111就可以了 。也就是说,不管正数还是补数表示的负数,只需要将 0 和 1 填充高位即可 。
 
逻辑运算的窍门掌握逻辑和运算的区别是:将二进制数表示的信息作为四则运算的数值来处理就是算数,像图形那样,将数值处理为单纯的01的罗列就是逻辑
计算机能够处理的运算,大体可分为逻辑运算和算数运算,算数运算指的是加减乘除四则运算;逻辑运算指的是对二进制各个数位的 0 和 1分别进行处理的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻辑或(OR运算)和逻辑异或(XOR运算)四种 。
逻辑非指的是将 0 变成 1,1 变成 0 的取反操作•逻辑与指的是"两个都是 1 时,运算结果才是 1,其他情况下是 0"•逻辑或指的是"至少有一方是 1 时,运算结果为 1,其他情况下运算结果都是 0"•逻辑异或指的是 "其中一方是 1,另一方是 0时运算结果才是 1,其他情况下是 0"
二进制世界的秘密

文章插图
与或非异或真值表
掌握逻辑运算的窍门,就是要摒弃二进制数表示数值这一个想法 。大家不要把二进制数表示的值当作数值,应该把它看成是 开关上的 ON/OFF
文章参考:
《程序是怎样跑起来的》
< END >




推荐阅读