Wie funktioniert der bitweise Komplementoperator (~ Tilde)?

Warum ist ~ 2 gleich -3? Wie funktioniert ~ Operator?

Denken Sie daran, dass negative Zahlen als das Zweierkomplement des positiven Gegenstücks gespeichert werden. Als Beispiel, hier ist die Darstellung von -2 im Zweierkomplement: (8 Bits)

 1111 1110 

Die Art und Weise, wie Sie dies erhalten, besteht darin, die Binärdarstellung einer Zahl zu nehmen, ihr Komplement zu nehmen (alle Bits zu invertieren) und eins hinzuzufügen. Zwei beginnt als 0000 0010, und durch Invertieren der Bits erhalten wir 1111 1101. Das Hinzufügen von eins bringt uns das obige Ergebnis. Das erste Bit ist das Vorzeichenbit, was ein Negativ bedeutet.

Sehen wir uns an, wie wir ~ 2 = -3 bekommen:

Hier sind noch zwei:

 0000 0010 

Drehe einfach alle Bits um und wir bekommen:

 1111 1101 

Nun, wie sieht -3 in Zweierkomplement aus? Beginnen Sie mit positivem 3: 0000 0011, drehen Sie alle Bits auf 1111 1100 und fügen Sie eins hinzu, um ein negativer Wert (-3), 1111 1101, zu werden.

Wenn Sie also die Bits in 2 einfach invertieren, erhalten Sie die Zweierkomplementdarstellung von -3.

Der Komplementoperator (~) JUST FLIPS BITS. Es liegt an der Maschine, diese Bits zu interpretieren.

~ dreht die Bits im Wert um.

Warum ~2 ist -3 hat damit zu tun, wie Zahlen bitweise dargestellt werden. Zahlen werden als Zweierkomplement dargestellt .

Also, 2 ist der Binärwert

 00000010 

Und ~ 2 kippt die Bits, so dass der Wert jetzt ist:

 11111101 

Welche, ist die binäre Darstellung von -3.

Wie andere erwähnt ~ nur umgedreht Bits (ändert eins zu Null und Null zu eins) und da Zweierkomplement verwendet wird, erhalten Sie das Ergebnis, das Sie gesehen haben.

Eine Sache, die hinzugefügt werden muss, ist, warum Zweierkomplement verwendet wird, das ist so, dass die Operationen auf negativen Zahlen die gleichen wie auf positiven Zahlen sind. Denken Sie an -3 als die Zahl, zu der 3 hinzugefügt werden soll, um Null zu erhalten, und Sie werden sehen, dass diese Zahl 1101 , denken Sie daran, dass die binäre Addition genau wie die Grundschule ist (dezimal) nur Sie tragen eine, wenn Sie zu bekommen zwei statt 10.

  1101 + 0011 // 3 = 10000 = 0000 // lose carry bit because integers have a constant number of bits. 

Deshalb ist 1101 -3 , klappen Sie die Bits um, die Sie 0010 was zwei ist.

Diese Operation ist eine Ergänzung, keine Negation.

Betrachte das ~ 0 = -1 und arbeite von dort aus.

Der Algorithmus für die Negation ist “Komplement, Inkrementieren”.

Wusstest du schon? Es gibt auch “Einerkomplement”, wo die umgekehrten Zahlen symmetrisch sind, und es hat sowohl eine 0 als auch eine -0.

int a = 4; System.out.println (~ a); Ergebnis wäre: -5

‘~’ einer beliebigen Ganzzahl in Java repräsentiert das 1-Komplement der Nr. zum Beispiel nehme ich ~ 4, was in der binären Darstellung 0100 bedeutet. Erstens ist die Länge einer ganzen Zahl vier Bytes, dh 4 * 8 (8 Bits für 1 Byte) = 32. So in System-Speicher 4 wird dargestellt als 0000 0000 0000 0000 0000 0000 0000 0100 jetzt ~ Operator wird 1-Komplement auf der obigen binären Nr. Ausführen

dh 1111 1111 1111 1111 1111 1111 1111 1011-> 1er Komplement das höchstwertige Bit stellt das Vorzeichen des Nein (entweder – oder +) dar, wenn es 1 ist, dann ist das Vorzeichen ‘-‘ wenn es 0 ist, dann ist Vorzeichen ‘+’ Das Ergebnis ist eine negative Zahl, in Java werden die negativen Zahlen in der 2er-Komplement-Form gespeichert, das erlangte Ergebnis müssen wir in das 2er-Komplement umwandeln (führen Sie zuerst das 1er-Komplement und einfach das 1er-Komplement auf). alle Eins werden Nullen, außer dem höchstwertigen Bit 1 (das ist unsere Vorzeichendarstellung der Zahl, das heißt für die verbleibenden 31 Bits 1111 1111 1111 1111 1111 1111 1111 1011 (erfaßtes Ergebnis des Operators ~) 1000 0000 0000 0000 0000 0000 0000 0100 (1 Ergänzung)

1 (Zweierkomplement)

1000 0000 0000 0000 0000 0000 0000 0101 jetzt das Ergebnis ist -5 überprüfen Sie diesen Link für das Video < [Bit weise Operatoren in Java] https://youtu.be/w4pJ4cGWe9Y

Ich weiß, dass die Antwort auf diese Frage lange zurückliegt, aber ich wollte meine Antwort für das gleiche teilen.

Um das Einerkomplement einer Zahl zu finden, finden Sie zuerst ihr binäres Äquivalent. Hier wird die Dezimalzahl 2 in binärer Form als 0000 0010 . Nun nimmt man das Einser-Komplement durch Invertieren (alle 1 in Nullen und alle Nullen in 1en umdrehen) alle Ziffern seiner binären Repräsentation, was folgendes ergibt:

 0000 0010 → 1111 1101 

Dies ist das Einerkomplement der Dezimalzahl 2. Und da das erste Bit, dh das Vorzeichenbit 1 in der Binärzahl ist, bedeutet dies, dass das Vorzeichen für die gespeicherte Zahl negativ ist. (Hier ist die Nummer nicht 2, sondern die Zweierzahl).

Jetzt, da die Zahlen als Zweierkomplement gespeichert sind (indem wir das Einerkomplement einer Zahl plus eins nehmen), müssen wir also, um diese Binärzahl 1111 1101 als Dezimalzahl anzuzeigen, zuerst ihr Zweierkomplement finden, das sein wird:

 1111 1101 → 0000 0010 + 1 → 0000 0011 

Dies ist das Zweierkomplement. Die dezimale Darstellung der Binärzahl 0000 0011 ist 3 . Und da das Vorzeichenbit eins war, wie oben erwähnt, ist die resultierende Antwort -3 .

Hinweis: Wenn Sie diese Prozedur sorgfältig lesen, hätten Sie beobachtet, dass das Ergebnis für den Einerkomplementoperator tatsächlich die Zahl (Operand – auf die dieser Operator angewendet wird) plus eins mit einem negativen Vorzeichen ist. Sie können dies auch mit anderen Nummern versuchen.

Einfach ………..

Als Zweierkomplement einer beliebigen Zahl können wir berechnen, indem wir alle 1en in Nullen umkehren und umgekehrt, als wir 1 zu ihr addieren.

Hier ergibt N = ~ N Ergebnisse – (N + 1) immer. Weil System Daten in Form von Zweierkomplement speichert, was bedeutet, dass ~ N so gespeichert wird.

  ~N = -(~(~N)+1) =-(N+1). 

Beispielsweise::

  N = 10 = 1010 Than ~N = 0101 so ~(~N) = 1010 so ~(~N) +1 = 1011 

Jetzt kommt der Punkt, von dem Minus kommt. Meine Meinung ist, dass wir ein 32-Bit-Register haben, was bedeutet, dass 2 ^ 31 -1 Bits in die Operation involviert sind und ein Bit ruht, das sich in früherer Berechnung (Komplement) als Vorzeichenbit ändert, das normalerweise 1 ist. Und wir bekommen das Ergebnis als ~ 10 = -11.

~ (-11) = 10;

Das obige ist wahr, wenn printf (“% d”, ~ 0); Wir erhalten Ergebnis: -1;

Aber printf (“% u”, ~ 0) als Ergebnis: 4294967295 auf 32-Bit-Maschine.


Der Bitwise-Komplementoperator (~) ist ein unärer Operator.

Es funktioniert wie folgt

Zuerst wandelt er die gegebene Dezimalzahl in den entsprechenden Binärwert um. Im Fall von 2 konvertiert er zuerst 2 zu 0000 0010 (zu 8 Bit Binärzahl).

Dann konvertiert es alle 1 in der Zahl in 0 und alle Nullen in 1, dann wird die Zahl 1111 1101.

das ist die 2-Komplement-Darstellung von -3.

Um den vorzeichenlosen Wert mittels Komplement zu finden, dh einfach 1111 1101 in dezimal (= 4294967293) umrechnen, können wir einfach das% u beim Drucken verwenden.

Ich denke, für die meisten Leute kommt der Verwirrungsteil aus dem Unterschied zwischen Dezimalzahl und vorzeichenbehafteter Binärzahl, also lasst uns zuerst klarstellen:

für die menschliche Dezimalwelt: 01 bedeutet 1, -01 bedeutet -1, für die binäre Welt des Computers: 101 bedeutet 5, wenn es vorzeichenlos ist. 101 bedeutet (-4 + 1), wenn es signiert ist, während die vorzeichenbehaftete Ziffer an der Position x ist. | x

Also das umgedrehte Bit von 2 = ~ 2 = ~ (010) = 101 = -4 + 1 = -3 Die Verwirrung entsteht durch Mischen des vorzeichenbehafteten Ergebnisses (101 = -3) und des nicht-gesammelten Ergebnisses (101 = 5)

Zuerst müssen wir die gegebene Zahl in ihre Binärziffern aufteilen und sie dann umkehren, indem sie an der letzten Binärstelle addieren. Nach dieser Ausführung müssen wir der vorherigen Ziffer ein umgekehrtes Vorzeichen geben, wobei wir die vollständige ~ 2 = -3 Erklärung finden : 2s binäre Form ist 00000010 ändert sich zu 11111101 das ist Einerkomplement, dann ergänzt 00000010 + 1 = 00000011 das ist die binäre Form von drei und mit -Zeichen Ie, -3

Der bitweise Operator ist ein unärer Operator, der nach meinen Erfahrungen und Kenntnissen mit der Zeichen- und Größenmethode arbeitet.

Zum Beispiel würde ~ 2 zu -3 führen.

Dies liegt daran, dass der bitweise Operator zuerst die Zahl in Vorzeichen und Größe darstellen würde, die 0000 0010 ist (8-Bit-Operator), wobei das MSB das Vorzeichenbit ist.

Dann würde es später die negative Zahl von 2 nehmen, die -2 ist.

-2 wird als 1000 0010 (8-Bit-Operator) in Vorzeichen und Größe dargestellt.

Später fügt es eine 1 zum LSB (1000 0010 + 1) hinzu, die Ihnen 1000 0011 gibt.

Was ist -3.

Javascript Tilde (~) erzwingt einen gegebenen Wert für das Einser-Komplement – alle Bits sind invertiert. Das ist alles, was Tilde tut. Es ist kein eigenmächtiges Zeichen. Es addiert oder subtrahiert keine Quantität.

 0 -> 1 1 -> 0 ...in every bit position [0...integer nbr of bits - 1] 

Auf Standard-Desktop-processoren, die Hochsprachen wie JavaScript verwenden, ist BASE10-Vorzeichenarithmetik am gebräuchlichsten, aber denken Sie daran, es ist nicht die einzige Art. Bits auf der CPU-Ebene können aufgrund einer Reihe von Faktoren interpretiert werden. Auf der ‘Code’-Ebene, in diesem Fall JavaScript, werden sie per Definition als eine 32-Bit-Ganzzahl mit Vorzeichen interpretiert (lassen wir Floats daraus heraus). Betrachten Sie es als Quanten, diese 32-Bit repräsentieren viele mögliche Werte auf einmal. Es hängt vollständig von der Konvertierungslinse ab, durch die Sie sie sehen.

 JavaScript Tilde operation (1's complement) BASE2 lens ~0001 -> 1110 - end result of ~ bitwise operation BASE10 Signed lens (typical JS implementation) ~1 -> -2 BASE10 Unsigned lens ~1 -> 14 

Alles oben Gesagte ist gleichzeitig wahr.