一元“~”运算符 - 这里到底发生了什么?
我最近做了一个Java课程(1周速成课程),我们涵盖了一些二进制数学。
这个一元~运算符(我想它叫波浪号?)是这样向我们解释的:
它将位模式反转,将每个“0”转换为“1”,将每个“1”转换为“0”。例如,一个字节有8位。如果您有以下字节:00000000,则倒排的值将更改为11111111。
上面的解释清晰简洁,对我来说完全有意义。直到,也就是说,我试图实现它。
鉴于此:
byte x = 3;
byte y = 5;
System.out.println(~x);
System.out.println(~y);
输出为:
-4
-6
我对这种情况是如何发生的感到非常困惑。
如果二进制中的+3是11,那么这个反转将是00,这显然不是-3。
但是,由于一个字节中有8位,那么+3的二进制表示不应该写成00000011吗?
这将反转成为11111100。转换回十进制值,这将是252。但是,如果您将+3写为011,那么它确实转换为100,即+4,但是您怎么知道它是负数呢?
如果您尝试0011,它将转换为1100,如果您使用第一位作为符号,那么它确实会变成-4。
啊 - 所以在这一点上,我以为我正在到达某个地方。
但后来我得到了y = 5的第二个值。
我们怎么写这个?使用相同的逻辑,+5 转换为二进制 0101,反转为 1010。
现在我感到非常困惑。这看起来表示 -2 的有符号值,或者表示十进制 +10 的无符号值?这两个都不是我正在打印出来的-6。
同样,如果我将长度增加到一个字节的8位数字,则+5 00000101,反转后变为11111010。我真的找不到办法把它变成-6。
有没有人理解这一点,因为我不知道这里发生了什么,我打印出来的数字越多,我就越困惑。
谷歌似乎对此没有提出太多意见 - 也许它不喜欢看小运营商的标志。:-(