写一个位翻转算法

Writing a bit flip algorithm

我正在尝试为以下问题编写算法。

问题陈述。

您将获得一个 32 位无符号整数列表。您需要输出通过翻转二进制表示中的位获得的无符号整数列表(即必须设置未设置的位,并且必须取消设置设置位)。

代码如下:

def bit_flip(a):
    return ~a & 0xffffffff

t = raw_input("")
a = map(int, t.split())
map(lambda x: x ^ 0xffffffff, a) 
for i in a:
    print bit_flip(int(i))

输入是

3
2147483647
1
0

我得到的输出是 4294967292

而输出应该是

**2147483648
  4294967294
  4294967295**

我不确定我哪里错了。输出接近至少一行输出,但不相同。

你的输出是正确的。 3的32位无符号补码确实是4294967292。您的程序产生的完整输出是:

4294967292
2147483648
4294967294
4294967295

正确对应数字 3、2147483647、1、0。如果将它们写成十六进制,您会更容易看到:

Dec         Hex       ~Hex      ~Dec
3           3         FFFFFFFC  4294967292
2147483647  7FFFFFFF  80000000  2147483648
1           1         FFFFFFFE  4294967294
0           0         FFFFFFFF  4294967295

您似乎将位翻转了两次,但第一次丢弃了结果:map(lambda x: x ^ 0xffffffff, a) returns 一个包含翻转值的列表,您没有将其分配给任何东西。如果您更改该行以将结果分配回 a,您将不再需要 bit_flip(这也翻转位,只是通过不同的方法):

t = raw_input("")
a = map(int, t.split())
a = map(lambda x: x ^ 0xffffffff, a) 
for i in a:
    print i

或更短:

for i in map(lambda x: int(x) ^ 0xffffffff, raw_input("").split()):
    print i

map(lambda x: x ^ 0xffffffff, a) 返回的列表是答案,但您没有使用它。

至少它有翻转位的整数,我不确定为什么预期输出的元素比输入少一个。