写一点翻转算法

时间:2015-01-15 17:13:16

标签: python algorithm bits

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

问题陈述。

您将获得一个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**

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

2 个答案:

答案 0 :(得分:2)

您的输出是正确的。 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)返回包含翻转值的列表,您不会将其分配给任何内容。如果您更改了该行以将结果分配回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

答案 1 :(得分:0)

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

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