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

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。

【讨论】:

以上是关于逻辑右移、算术右移、右移的区别的主要内容,如果未能解决你的问题,请参考以下文章

msg-2和msg-3逻辑分析途径的区别

信息的表示和处理

如何以可移植的方式在 C 中执行算术右移?

汇编中的移位指令(8086CPU)

循环右移

汇编--逻辑指令