Python对大二进制字符串的按位运算

时间:2016-07-02 15:14:10

标签: python python-2.7 binary bit-manipulation bitwise-operators

我想对长度超过100的零二进制字符串执行按位操作。我知道我可以使用像int('1'*100, 2)之类的东西来转换它们,最后用1267650600228229401496703205375L字符打印​​L。然后使用python按位运算符,但我认为将它们转换为整数是一个坏主意。还有其他办法吗?

3 个答案:

答案 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

文档:https://pypi.python.org/pypi/bitarray/0.8.1

答案 1 :(得分:1)

这是另一种最佳方法。

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

答案 2 :(得分:0)

不要对01的字符串执行按位操作,这些字符串很简单且很慢。您应该将字符串转换为实际数字,然后立即完成几位的处理。

没有任何问题
int('1'*128,2) & int('1'*128,2)

但是,如果您已经拥有01的字符串,并且您希望控制部分字符串的按位运算。您可以执行以下操作:

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)])))