什么是模32或64减少?

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)


Ada*_*cin 5

在许多编程语言中,移位超过数字数据类型的大小(对于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.