按负数移位

dha*_*ram 4 java bit-manipulation bit-shift bit

我对这里的表达很困惑.我是一名Java程序员,但我并不精通位操作.

我想我理解正确如下:

Input : 1 << 10
Output: 0000000000000000000010000000000
Run Code Online (Sandbox Code Playgroud)

对于正数,我认为你是1乘10位.

混淆是我有以下情况:

int val = -10 (binary representation : 1111111111111111111111111110110 )
Input : 1 << val
Output: 0000000010000000000000000000000 
Run Code Online (Sandbox Code Playgroud)

如果有人可以通过负数向我解释左移或右移的含义,那将是非常好的.

axt*_*avt 8

<<(和其他移位运算符)只需要其右操作数的5个最低有效位int,而6则用于long,因为移位int超过31 是没有意义的.

在你的情况下它是0b10110= 22.

因此1 << (-10)相当于1 << 22.


Jon*_*eet 5

从JLS,第15.19节:

如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离.就好像右手操作数受到按位逻辑AND运算符&(§15.22.1)和掩码值0x1f(0b11111)的影响.因此,实际使用的移位距离始终在0到31的范围内,包括0和31.

换一种说法,

1 << -10
Run Code Online (Sandbox Code Playgroud)

相当于:

1 << (-10 & 0x1f)
Run Code Online (Sandbox Code Playgroud)

......是的

1 << 22
Run Code Online (Sandbox Code Playgroud)