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
Antwort
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
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)])))
- 1. Rückgabetyp bitweise Operation in C
- 2. binäre Operation `|` kann nicht auf den Typ
- 3. Wie mache ich eine bitweise Not-Operation in Python?
- 4. Sollte eine lange binäre Zeichenfolge vor der Operation konvertieren
- 5. Und bitweise Operation bekommt negativen Wert
- 6. bitweise Operation auf eine Liste <bool>
- 7. In Sql Server, wie binäre Zeichenfolgen in binäre konvertieren?
- 8. bitweise Operationen auf Strings in Javascript
- 9. Wie konvertiert man große binäre in dezimal?
- 10. Python POST binäre Daten
- 11. interpretieren binäre Daten in Python
- 12. Python expandtabs string operation
- 13. bitweise Operator Postgres
- 14. Veränderliche Zeichenfolgen in Python
- 15. Bitweise Operation auf 2 Zahlen, um immer ein eindeutiges Ergebnis zu erzeugen?
- 16. python array.array mit Zeichenfolgen als Datentyp
- 17. Java - binäre AND (&) Operation für image.getRGB (x, y);
- 18. Integrierte binäre Suchstruktur in Python?
- 19. Python: logische oder bitweise Operator UND
- 20. Python-Modul für binäre plist
- 21. Große Datei in Python lesen
- 22. Binäre Serialisierung und Deserialisierung ohne Erstellen von Dateien (über Zeichenfolgen)
- 23. bitweise Operationen in OCaml
- 24. LC3 Montage Bitweise Rechtsverschiebung
- 25. perl bitweise UND und bitweise Verschiebung
- 26. In Python Pandas, boolesche Operation
- 27. repräsentieren binäre Suchbäume in Python
- 28. Python schreiben binäre Dateien, Bytes
- 29. schreiben große 4-Byte-Ganzzahl als unsigned binäre
- 30. direkt lesen große binäre Datei in C# w/out Kopieren
Warum denken Sie, es ist eine schlechte Idee ist, bitweise Operationen auf einem Python integer zu tun? –
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 –
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