为什么对二进制序列“ 0110 0100”进行3的右算术移位会导致“ 1110 1100”而不是“ 0000 1100”?

时间:2019-06-17 04:23:31

标签: bit-shift

在我正在查看的一本教科书中,它要求我对二进制序列0110 0100乘3(a >> 3)进行算术右移。我以为是0000 1100,因为考虑到最高有效位是0(或者是01吗?我会在右边添加3个零,但是答案键说正确的答案是1110 1100

算术移位的定义如下:

  

算术右移将k个重复的最高有效位填充到左端...

由于0110 0100中的最高有效位是0,我是否应该添加0而不是1?最高有效位实际上是01吗?

作为另一个示例,如果某个位引用的是前两位数字,而不仅仅是第一个数字,为​​什么将3右移到二进制序列0111 00100000 1110而不是{{ 1}}?

1 个答案:

答案 0 :(得分:0)

Index : 76543210
a >> 0: 01100100
a >> 1: 00110010
a >> 1: 00011001
a >> 1: 00001100

另一个例子:

Index : 76543210
a >> 0: 10000100
a >> 1: 11000010
a >> 1: 11100001
a >> 1: 11110000

这正是您所相信的。算术移位(也称为有符号移位)已经为您提供了一个很好的提示,它可以左右移动位,同时保留有符号位,而向右移动时,将复制有符号位。

这是正式定义:

  

一个移位,应用于固定基数中的数字表示   计数系统和定点表示系统,以及   其中只有代表定点部分的字符   号码被移动。算术移位通常等于   将数字乘以正整数或负整数   除任何取整效果外的基数;比较逻辑   随算术移位而变化,尤其是在   浮点表示。

维基百科条目上有一些很好的说明性图片:https://en.wikipedia.org/wiki/Arithmetic_shift

就像作者一样,他只是弄乱了自己的例子,想表明它保留了最左边的位(在大多数情况下)并复制了它。虽然他忘了设置。