逻辑右移、算术右移、右移的区别
Posted
技术标签:
【中文标题】逻辑右移、算术右移、右移的区别【英文标题】:The difference between logical shift right, arithmetic shift right, and rotate right 【发布时间】:2017-11-25 11:18:09 【问题描述】:我一直在阅读经典的《黑客之乐》,但我无法理解逻辑右移、算术右移和右旋转之间的区别。如果怀疑似乎太简单,请原谅。
【问题讨论】:
这和 C 有什么关系? ***的文章有什么问题?他们有什么不明白的地方? 我不明白算术和逻辑移位之间的区别。 【参考方案1】:首先要记住机器字的大小是固定的。说 4,你的输入是:
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
然后将所有内容向左推一个位置给出:
+---+---+---+---+
| b | c | d | X |
+---+---+---+---+
问什么是 X?
-
用 shift 放 0
用旋转把
a
现在把所有东西推到右边一个位置:
+---+---+---+---+
| X | a | b | c |
+---+---+---+---+
问什么是 X?
-
有一个逻辑移位把 0
带有算术移位把
a
用旋转把d
大概。
逻辑移位对应(左移)乘以2,(右移)整数除以2。
算术移位 与有符号数的 2 补码表示有关。在这种表示中,符号是最左边的位,然后算术移位保留符号(这称为符号扩展)。
旋转没有普通的数学意义,即使在计算机中也几乎是一种过时的操作。
【讨论】:
“移位”可以更具体地称为“逻辑移位”,不是吗? 逻辑移位不除以2。例如,-75 >>> 1 = 90。算术移位保留符号,因此乘以除以2 我从来没有说过逻辑移位是用于 2 的补码,只是算术移位。 有用的是注意算术右移向-Infinity
舍入,而普通的有符号除法(在 C 中)被截断为 0。因此为有符号 x 编译 x/2
需要在SAR指令。【参考方案2】:
最右边的列中几乎解释了差异。
逻辑移位将数字视为一组位,并以零移位。这是 C 语言中的>>
运算符。
算术移位将数字视为有符号整数(以 2 秒补码表示),并“保留”最高位,如果最高位为 0,则移入零,如果最高位为 1,则移入一。如果被移位的数字为负数,则 C 的右移运算符具有实现定义的行为。例如,二进制数 11100101
(十进制为 -27,假设 2s 补码),当右移 3 位时使用逻辑移位,变为00011100
(十进制28)。这显然令人困惑。使用算术移位,符号位将被保留,结果将变为11111100
(十进制-4,大约适合-27 / 8)。
旋转两者都没有,因为最高位被最低位替换。 C 没有操作符来做旋转。
【讨论】:
你能否更清楚地解释算术移位。请举例? @ChandrahasAroori 你可以在谷歌上找到大量的例子en.wikipedia.org/wiki/Bitwise_operation "11111100 (decimal ~4)" .. 不是 00000011 或 -3 的负数吗?【参考方案3】:逻辑右移表示将位右移,MSB(最高有效位)变为0。
示例:数字 1 0 1 1 0 1 0 1 的逻辑右移为 0 1 0 1 1 0 1 0。
算术右移表示将位右移,MSB(最高有效位)与原始数字相同。
示例:数字 1 0 1 1 0 1 0 1 的算术右移为 1 1 0 1 1 0 1 0。
【讨论】:
以上是关于逻辑右移、算术右移、右移的区别的主要内容,如果未能解决你的问题,请参考以下文章