我想对长度超过100的零二进制字符串执行按位操作。我知道我可以使用像int('1'*100, 2)
之类的东西来转换它们,最后用1267650600228229401496703205375L
字符打印L
。然后使用python按位运算符,但我认为将它们转换为整数是一个坏主意。还有其他办法吗?
答案 0 :(得分:3)
我猜你不喜欢使用整数的想法,因为它会混淆你的底层数据。另外,它很难处理以'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
答案 1 :(得分:1)
这是另一种最佳方法。
bin(int("1100",2)|int("1010", 2))
答案 2 :(得分:0)
不要对0
和1
的字符串执行按位操作,这些字符串很简单且很慢。您应该将字符串转换为实际数字,然后立即完成几位的处理。 :
int('1'*128,2) & int('1'*128,2)
但是,如果您已经拥有0
和1
的字符串,并且您希望控制部分字符串的按位运算。您可以执行以下操作:
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()
并将它们连接起来。 (注意删除0b
)
bin()
python 3版本:
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)])))