这是我到目前为止完成的工作:
2 ^ 32 = 10 ... 0
减1-> 01 ... 1这样就可以得到32 1's
1 = 01
翻转位-> 11 .... 10加1-> 1 ... 1这样就可以得到32 1's
我想念什么吗?我问是因为我尝试了一种练习problem,在该练习中,您必须翻转数字的所有二进制位。与-1进行异或运算不起作用,但与2 ^ 32-1进行异或运算则无效。
32位2的补码只能表示-(2 ^ 31)..(2 ^ 31)-1(含)范围内的值。由于2 ^ 32-1不在该范围内,因此可以推断出您使用的任何位模式实际上对应于does。
的值。让我们将一个整数的32位数字从0到31进行编号。数字#0代表2⁰,数字#1代表2¹,依此类推。更一般地,数字#n代表2ⁿ。
但是我们最多只能有#31位数字:我们有32位数字,但是我们从0开始计数。没有32位数字可创建2³²。
那么计算机做什么?它基本上是假装您写了2³²,但是删除了除前32位(0-31位)之外的所有数字。这称为integer overflow。这意味着2³²,“应该”为1,后跟32 0,实际上只是32 0-当然等于0。从中减去1,得到-1。
[如果您使用long(不是整数),那么您可以使用64位而不是32位。在这种情况下,在32位不会发生溢出,您会发现2³²-1不会t等于-1:就像您期望的那样,它等于4294967295。但是在这种情况下,出于类似原因,2⁶⁴为0。
要以2的补码形式创建任意数字,请翻转这些位并加1。
因此,-1为以下
1 = 00000000000000000000000000000001
flip those bits
11111111111111111111111111111110
add 1 to it and you get
11111111111111111111111111111111
现在为什么是-1?
Well -1 +1 = 0。
如果一起添加以下内容,则会得到
11111111111111111111111111111111
+00000000000000000000000000000001
您继续向左移动到下一个位置,最终使该字段溢出,剩下0。
00000000000000000000000000000000