“~”运算符是做什么的?
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
我发现 ~ 就像一个 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