按位和(&)运算符

use*_*413 3 java operations bit

我读到只做& 0x7fffffff符号位的掩码,并没有篡改其他位.

int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
Run Code Online (Sandbox Code Playgroud)

但是,这段代码输出

0
Run Code Online (Sandbox Code Playgroud)

代替

2147483648
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Krz*_*soń 5

Java中的负数存储为二进制补码.因此,最小值具有符号位设置而所有其他值未设置.所以你要做的是:

  10000000000000000000000000000000
& 01111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

清除符号位后,您将得到零.

  00000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

资料来源:https://en.wikipedia.org/wiki/Two%27s_complement