【问题标题】:The difference between logical shift right, arithmetic shift right, and rotate right逻辑右移、算术右移、右移的区别
【发布时间】:2017-11-25 11:18:09
【问题描述】:

我一直在阅读经典的《黑客之乐》,但我无法理解逻辑右移、算术右移和右旋转之间的区别。如果怀疑似乎太简单,请原谅。

【问题讨论】:

  • 这和 C 有什么关系?
  • 维基百科的文章有什么问题?他们有什么不明白的地方?
  • 我不明白算术和逻辑移位之间的区别。

标签: bit-manipulation bitwise-operators bit bit-shift


【解决方案1】:

首先要记住机器字的大小是固定的。说 4,你的输入是:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+

然后将所有内容向左推一个位置给出:

+---+---+---+---+
| b | c | d | X |
+---+---+---+---+

问什么是 X?

  1. shift 放 0
  2. 旋转a

现在把所有东西推到右边一个位置:

+---+---+---+---+
| X | a | b | c |
+---+---+---+---+

问什么是 X?

  1. 有一个逻辑移位把 0
  2. 带有算术移位a
  3. 旋转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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多