“~”运算符是做什么的?

What does the "~" operator do?

我发现 ~ 就像一个 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 位 - 你忘记了其他 28 位设置为 0,~ 将变成 1.

可视化最好使用Integer.toBinaryString

jshell> Integer.toBinaryString(~4)
 ==> "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 的补码 = 1111 1010(反转位)

2的5的补码=1111 1011(1对1的补码) 这等于 ~5

所以 4 的按位补码是~5