sky*_*ar7 2 java binary bit-manipulation
在Core Java Volume1一书中,有一个警告说:
注意:移位运算符的右侧参数以模32减小(除非左侧是长的,在这种情况下,右侧减少模64).例如,1 << 35的值与1 << 3或8相同.
这到底是什么意思?还有为什么1变为8,而不是在35左移后变为0?
非常感谢
pax*_*blo 10
减少模32意味着(在其基级)你保持减去32,直到你有一个介于0和31之间的数字.
换一种说法:
actualValue = givenValue % 32;
Run Code Online (Sandbox Code Playgroud)
的原因它,这是因为这是毫无意义的32位转向32位值到左(或右),因为它始终是零(因为你换挡位出一方和零转移在上另一方面 - 无论你开始做什么,这32次到32位的值都将导致零.
因此对于Java整数(32位),31是明智的限制.对于长(64位),63是明智的限制.
在您给出的示例中,1 << 35
移位值从35减少到3(从35 % 32 == 3
),1 << 3是8:
Binary
0000 0001 (1 << 0) == 1
0000 0010 (1 << 1) == 2
0000 0100 (1 << 2) == 4
0000 1000 (1 << 3) == 8
||||
|||+--- 1
||+---- 2
|+----- 4
+------ 8
Run Code Online (Sandbox Code Playgroud)
在许多编程语言中,移位超过数字数据类型的大小(对于int为32位,长为64位)未定义.在另一方面,Java定义它,使得(n << d)
相当于(n << (d % 32))
其中n
是int,并且(n << d)
等同于(n << (d % 64))
其中n
是一个长.
所以,1 << 35
等于1 << (35 % 32)
,等于1 << 3 = 8
.
归档时间: |
|
查看次数: |
2684 次 |
最近记录: |