12

我最近上了一门 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 的方法。

有没有人明白这一点,因为我不知道这里发生了什么,我打印的数字越多,我变得越困惑。

谷歌似乎对此并没有提出任何建议——也许它不喜欢看小运营商标志.. :-(

4

4 回答 4

8

看这个演示: -

3 ->  0011
~3 -> 1100  -> -4 (2's complement)

5 -> 0101
~5 -> 1010 -> -6 (2's complement)

由于有符号整数存储为 2 的补码,因此2's complement取. 现在since是一个负数。所以,结果是。情况也是如此。110041100-41010

1100 
0011  - 1's complement
0100  - 2's complement  - value = 4 (take negative)
于 2012-11-23T21:32:40.480 回答
4

来自维基百科:在二进制补码表示法中,非负数由其普通二进制表示形式表示;在这种情况下,最高有效位为0。二进制补码运算是取反运算,因此负数由绝对值的二进制补码表示。
为了获得二进制数的二进制补码,通过使用按位非运算将位反转或“翻转”;然后将 1 的值添加到结果值中,忽略在取 0 的二进制补码时发生的溢出。http://en.wikipedia.org/wiki/Two%27s_complement

因此,如果您有 0101,即 +5,则它的倒数是 1010,即 -5。

虽然您并没有真正将 010 读为 5,但是当您在开头看到 1 时,您知道要获得该数字,您必须再次反转其余数字以获得您想要否定的正数. 如果这是有道理的。

如果您以前没有使用过它,这有点陌生。这当然不是十进制数字的工作方式,但一旦你看到发生了什么,它实际上很简单。

十进制的 8 值写为 01010,它与 10101 取反。第一个数字 (1) 表示它是负数,然后将其余数字翻转回来得到数值:1010。

要记住的一件事是二进制补码与普通的旧二进制计数不同。在普通二进制中,10101 的值(在二进制补码中为 -8 如上所述)当然是 21。我想这就是混淆的地方 - 你如何通过查看它们来区分它们?您必须知道使用了哪种表示形式才能确定数字的实际值是多少。还有一个略有不同的补码。

这里给出了一个关于二进制数学的很好的教程,包括一个和两个的补码。 http://www.math.grin.edu/~rebelsky/Courses/152/97F/Readings/student-binary

于 2012-11-27T22:25:15.497 回答
2

有符号整数几乎普遍使用二进制补码存储。这意味着反转位(取反码)并加一。这样一来,您就没有整数零的两种表示形式(+0 和 -0),并且某些带符号的操作变得更容易在硬件中实现。

于 2012-11-23T21:33:00.870 回答
2

Java 在二进制补码中使用有符号数。当使用类型为“unsigned int”或“unsigned char”时,您的推理在 C 或其他语言中是正确的。

于 2012-11-23T21:34:39.387 回答