编写一个比特翻转算法

4
我正在尝试为以下问题编写算法。
问题陈述。
您将获得一个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**

我不确定我的错误在哪里。输出结果与至少一个输出行非常接近,但并不相同。


那个期望输出的输入是什么?似乎你对每个数字都进行了两次位翻转(一次是用 ^,另一次是在 bit_flip 中)。 - Cameron
这不是一道 HackerRank 的问题吗? - AlG
是的,我刚刚完成了一个基本的Python课程,但我已经卡在这个问题上一段时间了。 - sanster9292
我认为在上一个问题中,他是在询问他遇到的错误。而在这个问题中,他特别询问算法/为什么输出不正确。 - Feign
2个回答

2

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

4294967292
2147483648
4294967294
4294967295

将这些数字正确转换成二进制,分别为 11, 0x7FFFFFFF, 01, 00。如果你将它们写成十六进制,更容易看出来:

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) 返回包含已翻转值的列表,而您没有将其分配给任何内容。如果您将该行更改为将结果分配回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

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

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


这可能是因为第一个数字只是告诉我们接下来有多少个适当的测试用例/输入。 - greybeard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接