逻辑右移和算术右移的区别

逻辑右移和算术右移的区别,在了解了补数后,让我们返回到右移这个话题。前文已经介绍过,右移有移位后在最高位补0和补1两种情况。当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0。类似于霓虹灯往右滚动的效果。这就称为逻辑右移(图2-9)。

逻辑右移和算术右移的区别
图2-9 图形模式的右移(逻辑右移)

将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1)。这就称为算术右移。如果数值是用补数表示的负数值,那么右移后在空出来的最高位补1,就可以正确地实现1/2、1/4、1/8等的数值运算。如果是正数,只需在最高位补0即可。

现在我们来看一个右移的例子。将- 4(=11111100)右移两位。这时,逻辑右移的情况下结果就会变成00111111,也就是十进制数63,显然不是- 4的1/4。而算术右移的情况下,结果就会变成11111111,用补数表示就是- 1,即- 4的1/4(图2-10)。

逻辑右移和算术右移的区别
图2-10 逻辑右移和算术右移的区别
只有在右移时才必须区分逻辑位移和算术位移。左移时,无论是图形模式(逻辑左移)还是相乘运算(算术左移),都只需在空出来的低位补0即可。

下面顺便介绍一下符号扩充。以8位二进制数为例,符号扩充就是指在保持值不变的前提下将其转换成16位和32位的二进制数。将01111111这个正的8位二进制数转换成16位二进制数时,很容易就能得出0000000001111111这个正确结果,但是像11111111这样用补数来表示的数值,该如何处理比较好呢?实际上处理方法非常简单,将其表示成1111111111111111就可以了。也就是说,不管是正数还是用补数表示的负数,都只需用符号位的值(0或者1)填充高位即可。这就是符号扩充的方法。

逻辑右移和算术右移的区别
图2-11向我们展示了将符号位扩充到高位的具体流程。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!