Java 什么是~&引用;接线员怎么办?

Java 什么是~&引用;接线员怎么办?,java,bitwise-operators,Java,Bitwise Operators,我发现~类似于NOT运算符,因为在二进制中,它将所有的1都更改为0,所有的0都更改为1。因此,我探索了如何处理这段代码,我发现: int x = 5; System.out.println(~(x - 1)); // prints -5 但是二进制中的x是0101,4是0100。在0100上使用NOT运算符将创建1011,即11。怎么会是-5?int有32位-您忘记了设置为0的其他28位,~将变为1 最好使用Integer.tobinarysting进行可视化: jshell> Inte

我发现~类似于NOT运算符,因为在二进制中,它将所有的1都更改为0,所有的0都更改为1。因此,我探索了如何处理这段代码,我发现:

int x = 5;
System.out.println(~(x - 1)); // prints -5

但是二进制中的x是0101,4是0100。在0100上使用NOT运算符将创建1011,即11。怎么会是-5?

int
有32位-您忘记了设置为0的其他28位,
~
将变为1

最好使用
Integer.tobinarysting
进行可视化:

jshell> Integer.toBinaryString(~4)
$23 ==> "11111111111111111111111111111011"
关于为什么该值为-5:

让我们检查一下从~4+4得到的结果:

   11111111111111111111111111111011
 + 00000000000000000000000000000100
 ----------------------------------
   11111111111111111111111111111111
都是一个!如果现在添加1会发生什么

   11111111111111111111111111111111
 +                                1
 ----------------------------------
   00000000000000000000000000000000
计算溢出,得到0

因此:~4+4+1=0。换句话说,~4=-4-1=-5.

~是位运算符。 反转二进制表示的位 负数存储为2的补码。 5-1=4的二进制表示为0000 0100

现在,5=0000 0101的二进制表示形式 1的5的补码=1111010(反转位)

2的5的补码=1111011(将1与1的补码相加) 这等于~5

所以4的位补是~5