Python大二进制字符串的按位操作



我想对长度超过100个0和1的二进制字符串执行按位操作。我知道我可以使用像int('1'*100, 2)这样的东西来转换它们,它在末尾打印1267650600228229401496703205375LL字符。然后使用python按位运算符,但我认为把它们转换成整数是个坏主意。还有别的办法吗?

我猜您不喜欢使用整数的想法,因为它混淆了底层数据。此外,这使得处理以'0'开头的字符串变得困难(因为它们在转换为整数时被截断),更不用说有符号整数和端序的微妙之处了。

尝试使用bitarray模块,可以安装pip: pip install bitarray

from bitarray import bitarray
ba1 = bitarray('0' + '1'*100)
ba2 = bitarray('1' + '0'*100)
len(ba1)  # 101
len(ba2)  # 101
ba1[0]    # False
ba2[0]    # True
ba1 | ba2  # bitarray('1111111111.......)
# get your string back
ba1.to01()  # "01111111......."
我不能保证效率。但至少它让你清楚自己在做什么。

也适用于python3

Docs: https://pypi.python.org/pypi/bitarray/0.8.1

还有一种最优的方法。

bin(int("1100",2)|int("1010", 2))

不要对0 s和1 s的字符串进行按位操作,这显然是坏的和慢的。您应该将字符串转换为实际数字,因为这样就可以一次处理几个比特。:

int('1'*128,2) & int('1'*128,2)

但是如果你已经有了0 s和1 s的字符串,并且你想控制部分字符串的按位操作。您可以执行以下操作:

l = '1'*1024
r = '1'*1024
print map(lambda x: x[0] & x[1], [(int(l[i:i+64], 2), int(r[i:i+64], 2)) for i in range(0,1024,64)])

这有效地在字符串的小块(64位)上从左到右使用&

如果需要字符串,可以对每个结果调用bin()并将它们连接起来。(注意在bin()的输出开始时去掉开始的0b)


python 3 version:
l = '1'*1024
r = '1'*1024
print(list(map(lambda x: x[0] & x[1], [(int(l[i:i+64], 2), int(r[i:i+64], 2)) for i in range(0,1024,64)])))

最新更新