我发现〜就像一个NOT运算符,因为在二进制中,它将所有1更改为0,将所有0更改为1。因此,我探索了如何处理此代码,并发现了这一点:
int x = 5;
System.out.println(~(x - 1)); // prints -5
但是x二进制中的x是0101,4是0100。在0100上使用NOT运算符将创建1011,即11。
答案 0 :(得分:1)
int
有32位-您忘记了其他28位设置为0,而~
将变成1。
最好使用Integer.toBinaryString
进行可视化:
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。
答案 1 :(得分:0)
〜是按位运算符。 反转二进制表示的位 负数存储为2的补数。 5-1 = 4的二进制表示形式是0000 0100
现在5 = 0000 0101的二进制表示形式 1的5的补数= 1111 1010(反转位)
2的5的补码= 1111 1011(1补码加1s) 等于〜5
所以4的按位补码是〜5