为什么 n ^ (2 ** 32 - 1) 会翻转位?

问题描述 投票:0回答:2

试图找到解决这个问题的方法最终不得不放弃。谁能解释一下为什么下面的代码可以将 0 翻转为 1 和 1 翻转为 0?

00000000000000000000000000000001 ^ (2 ** 32 - 1)

输出:

11111111111111111111111111111110

谢谢

binary
2个回答
0
投票
2**32-1 = 11111111111111111111111111111111
1       = 00000000000000000000000000000001

由于您对两个元素进行异或,因此您正在比较存在位差异的位置。

0:1 = 1
1:0 = 1
0:0 = 0
1:1 = 0

由于

2**32-1
都是 1,因此只要第二个数字中有
1
,它就会在结果中表示为
0
。如果您的第二个数字中有
0
,它将在结果中表示为
1


0
投票

您没有具体指定它,但对于这个答案,我假设

**
是“幂”运算符,
^
是异或运算符。

2 ** 32(2 的 32 次方)是二进制的

100000000000000000000000000000000

减 1 则为

011111111111111111111111111111111

XOR 运算符将两个操作数中不相等的每一位设置为 1。

所有操作一起进行:


2**32 = 100000000000000000000000000000000
   -1 = 011111111111111111111111111111111
  
        011111111111111111111111111111111
  XOR   000000000000000000000000000000001
      = 011111111111111111111111111111110

您会发现,这并不取决于数字前有多少个

0
,因为 0 XOR 0 = 0。

© www.soinside.com 2019 - 2024. All rights reserved.