是否可以对Python中的字符串执行按位运算?

时间:2011-06-08 13:04:34

标签: python string bit-manipulation

这失败了,并不奇怪:

>>> 'abc' << 8
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'str' and 'int'
>>> 

如果ascii abc等于0110000101100010011000116382179,是否可以将其移动一些任意数量,以便'abc' << 801100001011000100110001100000000?< / p>

其他按位操作怎么样? 'abc' & 63 = 100011等?

4 个答案:

答案 0 :(得分:8)

您可能需要的是bitstring模块(请参阅http://code.google.com/p/python-bitstring/)。它似乎支持按位运算以及一些其他位数组操作。但是你应该小心地将字节输入它(例如b'abc'bytes('abc')),而不是字符 - 字符可以包含Unicode并占用多个字节。

答案 1 :(得分:7)

对字符串执行按位运算没有任何意义。您可能希望使用struct模块将字符串转换为数字:

>>> import struct
>>> x = 'abc'
>>> x = '\x00' * (4-len(x)) + x
>>> number = struct.unpack('!i', x)[0]
>>> number
6382179

然后,您可以在number上执行所有操作。当(if)你想要一个字符串回来时,你可以struct.pack('!i', number)

答案 2 :(得分:2)

我编写了几个函数来将ascii转换为int并仅使用builtins将其转换回来。我可能混淆了MSB / LSB,所以我使用[::-1]来反转输入字符串。如果您不喜欢订购,请轻松修复。

享受:

>>> intstr = lambda z : ''.join([str(unichr((z & (255*(256**i)))/(256**i))) for i in range(0,((len(bin(z)) - 2) / 8) + (1 if ((len(bin(z)) - 2) / 8) else 0))])
>>> strint = lambda z : reduce(lambda x,y: x | y, [ord(str(z)[i])*((2**8)**i) for i in range(len(str(z)))])
>>> strint('abc'[::-1])
6382179
>>> bin(strint('abc'[::-1]) & 63)
'0b100011'
>>> bin(strint('abc'[::-1]) << 8)
'0b1100001011000100110001100000000'

答案 3 :(得分:0)

使用eval函数获取字符串的输入,然后可以对字符串执行所有按位运算。

> t ="1|0"
eval(t)
output: 1