我最近上了一门 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 的方法。
有没有人明白这一点,因为我不知道这里发生了什么,我打印的数字越多,我变得越困惑。
谷歌似乎对此并没有提出任何建议——也许它不喜欢看小运营商标志.. :-(