Java中的位移

Cra*_*lus -2 java bit-manipulation bit

可能是我太累了.
为什么以下不显示相同的值?

int x = 42405;
System.out.println(x << 8);  
System.out.println((x &0x00ff) << 8);  
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,较低的位应该是清楚的

Jon*_*eet 5

编辑:好的,我将离开底部为后代...

如果xint,则它非常简单:x << 8将具有相同的值,x & 0xff并且仅当没有设置"中间"16位时:

  • x左移的前8位将变为无关紧要
  • 底部8位x由掩蔽保留

如果设置了任何 "中间"16位,那么x & 0xff将与x仍然由移位保留的位不同,因此结果将是不同的.

我不明白你为什么期望他们总是给出相同的结果......


我将假设它的类型xbyte,并且它实际上是负面的.

没有定义移位操作byte,所以首先有一个转换为int...而且根据你是否有掩码可以改变.

那么让我们来看看x-1 的情况.然后(int) x -1 -即比特模式为全1.向左移动8位,最后得到24 1s的位模式,然后是8 0s:

11111111111111111111111100000000 = -256
Run Code Online (Sandbox Code Playgroud)

现在考虑第二行代码 - 正在采用x & 0xff,它只取得提升值的底部8位x- 即255.你将左移8位,你最终得到16 0s,8 1s,然后8 0s:

00000000000000001111111100000000 = 65280
Run Code Online (Sandbox Code Playgroud)