3

長さが100個以上のバイナリ文字列に対してビット単位の演算を実行したい。私はのようなものを使ってそれらを変換することができることを知っています。末尾に文字で1267650600228229401496703205375Lを印刷します。その後、Pythonのビット単位の演算子を使用しますが、整数に変換することは悪い考えです。これを行う他の方法はありますか?大きなバイナリ文字列のPythonビット単位操作

+2

は、なぜあなたはPythonの整数にビット演算を行うには悪いアイデアだと思います:

ものpython3で

ドキュメント作品? –

+0

100または1000のゼロと1を整数に変換するのは良い考えですか?私の問題ではないbitwiseを使用して、変換は... @MartijnPieters –

+0

Martijn Pietersが言ったように、大きな整数はリンクリスト(opensslの 'BN_ *')のように保持されています。 bignum上の演算子でそれをやったり、それをチョッピングしてループしたりすることは、同じことです。 – grochmal

答えて

2

私はあなたがいるので、整数を使用しての考えを好きではないことを推測している:


のpython 3バージョン(bin()の出力の開始時に開始0bを削除するように注意しながら)基礎となるデータを難読化します。さらに、符号付き整数やエンディアンの微妙な表現はもちろん、 '0'で始まる文字列(整数に変換するときに切り捨てられるため)で作業するのが難しくなります。

ビット配列モジュールを使用してみてください。ピップ: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......." 

私は効率を発揮できません。しかし、少なくともあなたが働いているものは明らかです。 https://pypi.python.org/pypi/bitarray/0.8.1

0

0および1の文字列に対してビット単位の操作を実行しないでください文字列を実際の数に変換し、次に数ビットの処理を一度に行います。 ありと間違って何もありません:

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

は、しかし、あなたはすでに0 sおよび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()を呼び出して、文字列が必要な場合はそれらを連結することができます。

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)]))) 
関連する問題