Bitweiser Betrieb und Nutzung
Betrachten Sie diesen code:
x = 1 # 0001
x << 2 # Shift left 2 bits: 0100
# Result: 4
x | 2 # Bitwise OR: 0011
# Result: 3
x & 1 # Bitwise AND: 0001
# Result: 1
Ich kann verstehen, dass die arithmetischen Operatoren in Python (und anderen Sprachen), aber ich habe nie verstanden, 'bitweise' Operatoren ganz gut. Im obigen Beispiel (aus einem Python-Buch), ich verstehe den Links-shift, aber nicht die anderen beiden.
Auch, was sind bitweise Operatoren tatsächlich verwendet? Ich würde schätzen einige Beispiele.
Dies kann von Interesse sein: stackoverflow.com/questions/276706/what-are-bitwise-operators
Dies kann auch von Interesse sein: stackoverflow.com/questions/8556206/what-does-mean-in-python
Dies kann auch von Interesse sein: stackoverflow.com/questions/8556206/what-does-mean-in-python
InformationsquelleAutor 3zzy | 2009-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitweise Operatoren sind Operatoren, die auf multi-bit-Werte, aber konzeptionell ein bit zu einer Zeit.
AND
1 nur, wenn beide seiner Eingänge 1 sind, ansonsten 0.OR
ist 1, wenn eine oder beide seiner Eingänge 1 sind, ansonsten 0.XOR
1 nur, wenn genau eine seiner Eingänge 1 sind, ansonsten 0.NOT
1 nur, wenn der input 0 ist, andernfalls ist es 0.Diese können oft am besten, wie die Wahrheit Tabellen. Input-Möglichkeiten sind auf der oberen und linken, die resultierende bit ist eine der vier (zwei in der Falle NICHT, da es nur einen input -) Werte gezeigt, an der Kreuzung der Eingänge.
Ein Beispiel ist, wenn Sie möchten, dass nur die unteren 4 bits eines integer -, Sie UND es mit 15 (Binär 1111), so:
Der null-bits in 15 in diesem Fall effektiv als filter fungieren, zwingt die bits im Ergebnis zu zero.
Darüber hinaus
>>
und<<
werden oft auch als bitweise Operatoren, und Sie die "shift" - Wert jeweils rechts und Links durch eine bestimmte Anzahl von bits, wegwerfen bits, die Rolle der end-du bist der Umstieg auf und die Fütterung in null-bits am anderen Ende.So, zum Beispiel:
Beachten Sie, dass die linke shift-in Python ist ungewöhnlich, dass es nicht mit einer festen Breite, wo die bits werden verworfen - während viele Sprachen verwenden eine Feste Breite, die basierend auf dem Datentyp, Python einfach erweitert die Breite um sorgen für zusätzliche bits. Um das verwerfen Verhalten in Python, können Sie eine Verschiebung nach Links mit einem bitweisen
and
wie in einem 8-bit-Wert Verschiebung linken vier bits:In diesem Sinne, ein weiteres Beispiel für bitweise Operatoren ist, wenn Sie zwei 4-bit-Werte, die Sie wollen, um zu packen in eine 8-bit-Version, die Sie verwenden können, sind alle drei Betreiber (
left-shift
,and
undor
):& 15
Betrieb stellen Sie sicher, dass beide Werte nur die unteren 4 bits.<< 4
ist ein 4-bit-Verschiebung nach Links zu bewegenval1
in den oberen 4 bits des 8-bit-Wert.|
kombiniert einfach diese beiden zusammen.Wenn
val1
7 undval2
4:0xffffffff << 32 = 0xffffffff00000000
guter Punkt, incorporated, die in der Antwort.
wo werden Sie verwendet?
InformationsquelleAutor paxdiablo
Eine typische Verwendung:
|
wird verwendet, um ein bestimmtes bit auf 1&
wird genutzt um zu überprüfen oder deaktivieren Sie eine bestimmte bit -Ein bit (wobei n die bit-Zahl und 0 ist das niederwertigste bit):
unsigned char a |= (1 << n);
Klar ein bisschen:
unsigned char b &= ~(1 << n);
Etwas ändern:
unsigned char c ^= (1 << n);
Test ein wenig:
unsigned char e = d & (1 << n);
Nehmen den Fall auf Ihrer Liste stehen zum Beispiel:
x | 2
wird verwendet, um bit 1x
1x & 1
wird verwendet, um zu testen, ob bit 0 vonx
1 oder 0InformationsquelleAutor pierrotlefou
Einer der häufigsten Verwendungen von bitweisen Operationen ist für die Analyse von hexadezimalen Farben.
Zum Beispiel, hier ist ein Python Funktion akzeptiert eine Zeichenfolge wie
#FF09BE
und gibt ein Tupel von Rot -, Grün-und Blau-Werte.Ich weiß, dass es noch effizientere Möglichkeiten zu erreichen, aber ich glaube, dass dies ein wirklich prägnantes Beispiel zur Veranschaulichung beide Schichten und bitweise Boolesche Operationen.
InformationsquelleAutor bguiz
Ich denke, dass der zweite Teil der Frage:
Wurde nur teilweise angesprochen. Das sind meine zwei Cent auf diese Angelegenheit.
Bitweise Operationen in der Programmierung mit Sprachen spielen eine fundamentale Rolle beim Umgang mit einer Vielzahl von Anwendungen. Fast alle low-level-computing muss getan werden mit dieser Art von Operationen.
In allen Anwendungen, die zum senden von Daten zwischen zwei Knoten, wie zum Beispiel:
computer-Netzwerke;
Telekommunikations-Anwendungen (Handys, Satelliten-Kommunikation, etc).
In der unteren Ebene der Kommunikation, die Daten werden in der Regel an, was als frames. Frames werden nur strings von bytes, die gesendet werden, durch einen physikalischen Kanal. Diese frames enthalten in der Regel die eigentlichen Daten, sowie einige andere Felder (codiert in bytes), die Teil der sogenannten header. Der header enthält in der Regel bytes Kodieren, einige Informationen in Bezug auf den status der Kommunikation (e.g, mit flags (bits)), frame-Zähler, correction und error detection codes, etc. Um die übertragenen Daten in einem Rahmen und bauen Sie den Rahmen, um Daten zu senden, müssen Sie sicher bitweise Operationen.
Im Allgemeinen, beim Umgang mit dieser Art von Anwendungen ist eine API verfügbar, so dass Sie nicht haben, um alle diese details. Zum Beispiel, dass alle modernen Programmiersprachen bieten Bibliotheken für socket-verbindungen, so dass Sie nicht wirklich brauchen, zu bauen, die TCP/IP-Kommunikation verwendet frames. Aber denken Sie an die guten Menschen, die programmiert werden diese APIs für Sie, Sie musste sich mit frame-Konstruktion für sicher; mit allen Arten von bitweisen Operationen hin und her gehen von den low-level auf der höheren Ebene der Kommunikation.
Als ein konkretes Beispiel, stellen Sie sich vor jemand gibt dir eine Datei mit raw-Daten, die aufgezeichnet wurde, direkt von Telekommunikations-hardware. In diesem Fall, um zu finden, die frames, Sie benötigen zum Lesen der raw-bytes in die Datei, und versuchen zu finden irgendeine Art von Synchronisation Worte, Scannen, werden die Daten bit für bit. Nach der Bestimmung der Synchronisation Wörter, die Sie brauchen, um die aktuellen frames, und SHIFT Sie Sie, wenn nötig (und das ist nur der Anfang der Geschichte) zu bekommen die eigentlichen Daten, die übertragen werden.
Weitere, sehr unterschiedliche low-level-Familie von Anwendung ist, wenn Sie brauchen, um die Kontrolle über die hardware mit einigen (alten) ports wie parallel-und serial-ports. Diese ports werden kontrolliert durch setzen von Byte und jedes bit dieses bytes hat eine Besondere Bedeutung, in Bezug auf die Anweisungen für diesen Anschluss (siehe zum Beispiel http://en.wikipedia.org/wiki/Parallel_port). Wenn Sie möchten, eine software zu erstellen, dass hat etwas mit dieser hardware müssen Sie bitweise Operationen zu übersetzen die Anweisungen, die Sie ausführen wollen, zu der bytes, die der Hafen zu verstehen.
Zum Beispiel, wenn Sie haben einige physische Tasten an den parallelen Anschluss angeschlossen, um die Kontrolle über einige andere Gerät, das ist eine Zeile code, die Sie finden können in der soft Anwendung:
Hoffe, das trägt.
InformationsquelleAutor eguaio
Ich hoffe, das klärt die beiden:
Oops... habe versucht, die Schnellste Waffe im Westen.... endete als ein idiot, der nicht einmal weiß, binäre für zwei 🙁 es Behoben.
x & 1
nicht veranschaulichen, die Wirkung sowiex & 2
würde.InformationsquelleAutor Amarghosh
Denke, dass 0 als false und 1 als true. Dann bitweise und(&) und oder(|) funktionieren genauso wie die normalen die und und oder-außer Sie tun alle bits im Wert auf einmal. In der Regel werden Sie sehen, Sie verwendet werden, für die Fahnen, wenn Sie über 30 Optionen, die festgelegt werden können (sagen wir, wie ziehen die styles auf einem Fenster) Sie wollen nicht zu Durchlaufen haben, in 30 separaten Boolesche Werte einstellen oder unset jeder so verwenden Sie|, um Optionen zu kombinieren in einem einzigen Wert, und verwenden Sie dann & um zu überprüfen, ob jede option eingestellt ist. Dieser Stil der Flagge vorbei ist stark verwendet OpenGL. Da jedes bit ist eine separate fahne erhalten Sie flag-Werte auf Potenzen von zwei(aka zahlen, dass nur ein bit gesetzt) 1(2^0) 2(2^1) 4(2^2) 8(2^3) die Kraft der zwei erzählt Sie, das bit wird gesetzt, wenn das flag auf.
Beachten Sie auch, 2 = 10, also x|2 110(6) nicht 111(7), Wenn keines der bits überlappen(das ist in diesem Fall true) | acts like.
InformationsquelleAutor stonemetal
Ich gar nicht erwähnt, aber Sie werden auch sehen, dass einige Menschen verwenden Sie die Links-und rechts-shift für arithmetische Operationen. Ein Links-shift von x entspricht Multiplikation mit 2^x (solange es nicht überläuft) und eine nach rechts entspricht der Division durch 2^x.
Vor kurzem habe ich Leute gesehen, die mit x << 1 und x >> 1 für die Verdoppelung und Halbierung, obwohl ich bin mir nicht sicher, ob Sie nur versuchen, schlau zu sein oder wenn es wirklich einen deutlichen Vorteil gegenüber der normalen Operatoren.
Mein argument gegen die Verwendung der bit-shift-Operatoren wäre, dass die meisten modernen Compiler sind wahrscheinlich die Optimierung der arithmetischen Operationen schon so über die Klugheit ist im besten Fall irrelevant, im schlimmsten Fall die Bekämpfung der compiler. Ich habe keine Erfahrung in C, Compiler oder CPU-designs und so nicht nehme, bin ich richtig. 🙂
Dieser sollte höher sein. Ich hatte Umgang mit einigen code, wurden mit Hilfe von bitweisen operator genau so, und diese Antwort hat mir geholfen, herauszufinden Dinge aus.
InformationsquelleAutor P. Stallworth
Diesem Beispiel zeigen Sie die Vorgänge für alle vier 2-bit-Werte:
Hier ist ein Beispiel der Verwendung:
InformationsquelleAutor dansalmo
Ein weiterer häufiger Anwendungsfall ist das manipulieren von/testing-Datei Berechtigungen. Finden Sie in der Python-stat-Modul: http://docs.python.org/library/stat.html.
Beispielsweise zum vergleichen die Berechtigungen für eine Datei auf eine gewünschte Berechtigung gesetzt, Sie könnten etwas tun wie:
Warf ich die Ergebnisse als Boolesche Werte, weil ich nur die Sorge um die Wahrheit oder Lüge, sondern es wäre eine lohnende übung, um Druck aus dem Behälter() Werte für jeden.
not bool((mode ^ desired_mode) & 0777)
. Oder (einfacher zu verstehen):not (mode & 0777) ^ desired_mode == 0
. UND verlassen nur das interessante bit, XOR prüfen, was alle gewünschten bit gesetzt sind. Explizite== 0
Vergleich ist aussagekräftiger alsbool()
.Ich glaube nicht, dass dies spezifisch für Datei-Operationen. Zum Beispiel, in PyQt und Sie tun etwas ähnliches für
setWindowFlags
. Beispiel:setWindowFlags(SplashScreen | WindowStaysOnTopHint)
. Ich finde immer noch das verwirrend, wie es scheint, wie ein wechseln Sie die Einstellung auf 'on', so scheint es, mehr intuitiv 'und' in diesem Fall.InformationsquelleAutor dbn
Bit-Darstellungen von ganzen zahlen sind oft in scientific computing darstellen arrays von wahr-falsch-Informationen, da eine bitweise operation ist viel schneller als die Iteration durch ein array von booleans. (Höhere level-Sprachen verwenden können, die Idee von einem bit-array.)
Ein nettes und Recht einfaches Beispiel HIERFÜR ist die Allgemeine Lösung für das Spiel Nim. Werfen Sie einen Blick auf die Python code auf die Wikipedia-Seite. Es macht starken Gebrauch von bitweisen exklusiv-oder -
^
.InformationsquelleAutor Jonah
Setzt
Sets können kombiniert werden, die mit Hilfe mathematischer Operationen.
|
verbindet zwei Sätze zu einer neuen eins, die Elemente enthalten, entweder.&
bekommt nur Elemente in beiden.-
bekommt items im ersten Satz aber nicht in der zweiten.^
erhält Elemente, die in beiden gesetzt, aber nicht beide.Versuchen Sie Es Selbst:
Ergebnis:
InformationsquelleAutor PUNEET JAIN
Kann es einen besseren Weg, um herauszufinden, wo ein array-element ist zwischen zwei Werten, aber wie dieses Beispiel zeigt, die & der hier arbeitet, in der Erwägung, dass und nicht.
InformationsquelleAutor woodfoot
ich nicht sehen es bereits erwähnt, ist Dieses Beispiel wird Ihnen zeigen, die (-) dezimal-Betrieb für den 2-bit-Werte: A-B (nur wenn A enthält B)
dieser Vorgang ist notwendig, wenn wir ein verb in unserem Programm darstellen-bits. manchmal müssen wir hinzufügen, bits (wie oben), und manchmal müssen wir entfernen-bits (wenn das verb enthält dann)
mit python:
7 & ~4 = 3 (entfernen von 7 bit darstellen 4)
mit python:
1 & ~4 = 1 (entfernen von 1 bit darstellen 4 - in diesem Fall 1 ist nicht 'enthält' 4)..
InformationsquelleAutor Eyal Ch
Während die Manipulation von bits eines integer ist nützlich, oft für Netzwerk-Protokolle, die angegeben werden können, nach unten auf das bit, kann man verlangen, manipulation von mehr-byte-Sequenzen (die sich nicht leicht konvertiert werden zu einem integer). In diesem Fall ist es nützlich zu beschäftigen, die bitstring Bibliothek, die erlaubt für bitweise Operationen auf Daten - z.B. kann man importieren die Zeichenfolge "ABCDEFGHIJKLMNOPQ" als string oder als hex und bit-Verschiebung (oder andere bitweise Operationen):
InformationsquelleAutor Pierz
folgende bitweise Operatoren: &, |, ^, und ~ return-Werte (basierend auf Ihrem input) in der gleichen Weise Logik gates Signale betreffen. Man könnte Sie verwenden, um zu emulieren schaltungen.
InformationsquelleAutor Erik Waters
Flip-bits (also 1 ergänzen/invertieren) können Sie Folgendes tun:
Da Wert ExORed mit all 1s-Ergebnisse in inversion,
für eine bestimmte bit-Breite, die Sie verwenden können, ExOR invertiert.
InformationsquelleAutor user11034079