【发布时间】:2017-11-25 11:18:09
【问题描述】:
【问题讨论】:
-
这和 C 有什么关系?
-
维基百科的文章有什么问题?他们有什么不明白的地方?
-
我不明白算术和逻辑移位之间的区别。
标签: bit-manipulation bitwise-operators bit bit-shift
【问题讨论】:
标签: bit-manipulation bitwise-operators bit bit-shift
首先要记住机器字的大小是固定的。说 4,你的输入是:
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
然后将所有内容向左推一个位置给出:
+---+---+---+---+
| b | c | d | X |
+---+---+---+---+
问什么是 X?
a
现在把所有东西推到右边一个位置:
+---+---+---+---+
| X | a | b | c |
+---+---+---+---+
问什么是 X?
a
d
大概。
逻辑移位对应(左移)乘以2,(右移)整数除以2。
算术移位 与有符号数的 2 补码表示有关。在这种表示中,符号是最左边的位,然后算术移位保留符号(这称为符号扩展)。
旋转没有普通的数学意义,即使在计算机中也几乎是一种过时的操作。
【讨论】:
-Infinity 舍入,而普通的有符号除法(在 C 中)被截断为 0。因此为有符号 x 编译 x/2 需要在SAR指令。
最右边的列中几乎解释了差异。
>> 运算符。算术移位将数字视为有符号整数(以 2 秒补码表示),并“保留”最高位,如果最高位为 0,则移入零,如果最高位为 1,则移入一。如果被移位的数字为负数,则 C 的右移运算符具有实现定义的行为。
例如,二进制数 11100101(十进制为 -27,假设 2s 补码),当右移 3 位时使用逻辑移位,变为00011100(十进制28)。这显然令人困惑。使用算术移位,符号位将被保留,结果将变为11111100(十进制-4,大约适合-27 / 8)。
旋转两者都没有,因为最高位被最低位替换。 C 没有操作符来做旋转。
【讨论】:
逻辑右移表示将位右移,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。
【讨论】: