我正在用Java测试按位not运算符。我以二进制形式打印了〜1的结果,它返回了“ 1111111111111111111111111111111010”,该结果显然为-2。
我知道您必须对此加1才能得到-1,并且最左边的位仅显示该数字是正数还是负数,但是我不明白的是为什么一个二进制数这么大又那么大1s等于-2。
答案 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
将最左边的(前导)位定义为从哪里开始计数会很有帮助:
它右边的其余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为例):
将其写为二进制文件(对于较短的表示,假设只有8位)
00000010
取反所有位
11111101
加1
11111110
这基本上就是为什么2看起来像这样的原因。