在我正在查看的一本教科书中,它要求我对二进制序列0110 0100
乘3(a >> 3
)进行算术右移。我以为是0000 1100
,因为考虑到最高有效位是0
(或者是01
吗?我会在右边添加3个零,但是答案键说正确的答案是1110 1100
。
算术移位的定义如下:
算术右移将k个重复的最高有效位填充到左端...
由于0110 0100
中的最高有效位是0
,我是否应该添加0而不是1?最高有效位实际上是01
吗?
作为另一个示例,如果某个位引用的是前两位数字,而不仅仅是第一个数字,为什么将3右移到二进制序列0111 0010
,0000 1110
而不是{{ 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
就像作者一样,他只是弄乱了自己的例子,想表明它保留了最左边的位(在大多数情况下)并复制了它。虽然他忘了设置。