11111111111111111111111111111111110如何评估为-2?

时间:2018-12-06 15:40:11

标签: java binary bit-manipulation

我正在用Java测试按位not运算符。我以二进制形式打印了〜1的结果,它返回了“ 1111111111111111111111111111111010”,该结果显然为-2。

我知道您必须对此加1才能得到-1,并且最左边的位仅显示该数字是正数还是负数,但是我不明白的是为什么一个二进制数这么大又那么大1s等于-2。

3 个答案:

答案 0 :(得分:2)

11111111111111111111111111111110是原始位表示。 Java使用two's complement来表示有符号的值,其中第一位(如果已设置)表示负数。

Conversion from Two's Complement对此做了很好的解释:

  

以数字0xFFFFFFFF为例。用二进制表示,即:

     

1111 1111 1111 1111 1111 1111 1111 1111

     

关于这个数字我们能说些什么?它的第一个(最左边)位为1,表示这表示一个负数。这就是事物取二的补码的方式:前导1表示数字为负,前导0表示数字为0或正。

     

要查看此数字是负数,请反转此数字的符号。但是该怎么做呢?该类笔记说(在3.17上),要反转符号,您只需将位反转(0变为1,1变为0),然后将其加1。

     

该二进制数的求反显然是:

     

0000 0000 0000 0000 0000 0000 0000 0000

     

然后我们添加一个。

     

0000 0000 0000 0000 0000 0000 0000 0001

     

因此0xFFFFFFFF的负数是0x00000001,通常称为1。所以0xFFFFFFFF-1

上图说明了0xFFFFFFFF的2的补码中的负数(如反向位和加1)为何是1,这意味着0xFFFFFFFF本身就是-1。以同样的方式,您的0xFFFFFFFE值具有2的负数,因此,0xFFFFFFFE本身就是-2的二进制补码。

答案 1 :(得分:1)

另一种思考方式是,在32位带符号整数中,最左边的数字表示两个数字之一:

df.col2=df.col2.drop_duplicates().reindex(df.index,fill_value=0)
df
Out[1078]: 
  col1  col2
0    a     0
1    b     1
2    c     0
3    d     0
4    c     0
5    d     0

根据定义。其他所有内容都是对此的添加(添加),所以:

0000000000000000000000000000000 represents 0
1000000000000000000000000000000 represents -2147483648

将最左边的(前导)位定义为从哪里开始计数会很有帮助:

  • 如果最左边的位为0,则从0开始计数
  • 如果最左边的位为1,则从-2147483648开始计数

它右边的其余31位通过组成一个数字(BINARY REPRESENTATION INT REPRESENTATION 1000000000000000000000000000000 plus -2147483648 plus 0111111111111111111111111111110 equals 2147483646 equals 1111111111111111111111111111110 -2 最多为2147483647)来定义整数值。


然后有效地将带符号的整数环绕起来。它们的最大价值约为20亿,然后立即翻转至-20亿并再次计数为0:

111 1111 1111 1111 1111 1111 1111是2147483647。如果对此添加一个,则会得到: 0111111111111111111111111111111,它可以是2147483648(无符号整数)或-2147483648(根据定义)。当您不断添加任何整数时,它接近: 1000000000000000000000000000000,它是有符号整数为-1或无符号整数为4294967295

最终,您应该理解并理解,如果您继续将它们加起来,则有符号整数会环绕,但是它们会立即从中间的最大正值跳到最小负值:

1111111111111111111111111111111

这就是为什么您的“ 11111111111111111111111111111110”为-2的原因,它比最大二进制表示(在有符号整数空间中表示-1)小1。

答案 2 :(得分:0)

是补码。如果要将数字转换为TC(以2为例):

  1. 将其写为二进制文件(对于较短的表示,假设只有8位)

    00000010

  2. 取反所有位

    11111101

  3. 加1

    11111110

这基本上就是为什么2看起来像这样的原因。