我想对长度超过100个0和1的二进制字符串执行按位操作。我知道我可以使用像int('1'*100, 2)
这样的东西来转换它们,它在末尾打印1267650600228229401496703205375L
和L
字符。然后使用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)])))