3

Ich möchte bitweise Operation auf Binärzeichenfolgen mit einer Länge von mehr als 100 Nullen und Einsen durchführen. Ich weiß, dass ich sie mit etwas wie int('1'*100, 2) konvertieren kann, die 1267650600228229401496703205375L mit L Zeichen am Ende druckt. Dann benutze python-bitweise Operatoren, aber ich denke, es ist eine schlechte Idee, sie in ganze Zahlen zu konvertieren. Gibt es einen anderen Weg, dies zu tun?Python bitweise Operation auf große binäre Zeichenfolgen

+2

Warum denken Sie, es ist eine schlechte Idee ist, bitweise Operationen auf einem Python integer zu tun? –

+0

Ist es eine gute Idee, eine 100 oder 1000 Null und Eins in eine ganze Zahl zu konvertieren? Bitweis ist es nicht mein Problem, Konvertierung ist ... @MartijnPieters –

+0

Was Martijn Pieters sagte, eine große Ganzzahl wird als eine verknüpfte Liste gehalten (wie openssls 'BN_ *'). Wenn Sie es mit einem Operator über einem Bignum tun oder es hacken und es selbst schleifen, endet es damit, dass es dasselbe ist. – grochmal

Antwort

2

Ich vermute, dass Sie nicht auf die Idee gefällt ganzen Zahlen verwenden, weil Es verschleiert die zugrunde liegenden Daten. Außerdem ist es schwierig, mit Strings zu arbeiten, die mit "0" beginnen (weil sie beim Konvertieren in eine Ganzzahl abgeschnitten werden), ganz zu schweigen von den Feinheiten der Ganzzahlen mit Vorzeichen und der Endianess.

Versuchen Sie es mit dem Bitarray-Modul, kann mit Pip installiert werden: 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......." 

Ich kann nicht für die Effizienz sprechen. Aber zumindest fühlt es sich klar an, mit was Sie arbeiten.

arbeitet auch in python3

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

0

Führen Sie keine bitweisen Operationen an den Strings 0 s und 1 durch, das ist schlecht und langsam. Sie müssen die Strings in tatsächliche Zahlen umwandeln, da dann die Verarbeitung mehrerer Bits gleichzeitig erfolgt. Es ist nichts falsch mit:

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

Aber wenn Sie bereits haben Saiten 0 s und 1 s und Sie wollen die Kontrolle über die bitweise Operation auf Teile der Saiten. Sie können folgendes tun:

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

Diese effektiv die & über kleine Stücke (64 Bits) der Zeichenfolge verwendet, von links nach rechts.

Sie können bin() für jedes Ergebnis aufrufen und sie verketten, wenn Sie eine Zeichenfolge benötigen. (Darauf achten, den Start 0b zu Beginn der Ausgabe von bin() zu entfernen)


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