【发布时间】:2010-12-30 15:37:03
【问题描述】:
如果移位的数字是正数 >>> 和 >> 工作相同。
如果移位的数字是负数 >>> 用 1 填充最高有效位,而 >> 操作移位用 0 填充 MSB。
我的理解正确吗?
如果负数存储时 MSB 设置为 1,而不是 Java 使用的 2s 补码方式,则运算符的行为将完全不同,对吗?
【问题讨论】:
如果移位的数字是正数 >>> 和 >> 工作相同。
如果移位的数字是负数 >>> 用 1 填充最高有效位,而 >> 操作移位用 0 填充 MSB。
我的理解正确吗?
如果负数存储时 MSB 设置为 1,而不是 Java 使用的 2s 补码方式,则运算符的行为将完全不同,对吗?
【问题讨论】:
正好相反,如果 h.o 位为 1,则 >>> 用零填充,而 >> 用 1 填充。
【讨论】:
7>>>32=7。我听说过循环班次,但我认为这只适用于>>。 7>>>32 在 32 个班次之后不会等于零吗?
Definition of the >>> operator in the Java Language Specification:
n>>>s的值是 n 个右移 s 位位置,扩展为零。如果 n 为正,则结果与n>>s相同;如果 n 为负数,如果左侧操作数的类型为int,则结果等于表达式(n>>s)+(2<<~s)的结果;如果左侧操作数的类型为(n>>s)+(2L<<~s),则结果等于表达式(n>>s)+(2<<~s)的结果操作数是long。
【讨论】:
表示负数的方式称为 2 的补码。为了演示这是如何工作的,以 -12 为例。 12,在二进制中,是 00001100(假设整数是 8 位,但实际上它们要大得多)。通过简单地反转每一位来取 2 的补码,得到 11110011。然后,只需加 1 即可得到 11110100。请注意,如果再次应用相同的步骤,则会得到正数 12。
>>> 无论如何都会移到零,所以 12 >>> 1 应该给你 00000110,即 6,而 (-12) >>> 1 应该给你 01111010,即 122。如果你真的在 Java 中试试这个,你会得到一个更大的数字,因为 Java 整数实际上远大于 8 位。
>> 移动位与最高位相同,因此正数保持正数,负数保持负数。 12 >> 1 是 00000110(仍然是 6), (-12) >> 1 是 11111010,即负 6。
【讨论】: