Wie funktioniert der bitweise Komplementoperator (~ Tilde) von Python?

Lesezeit: 8 Minuten

balas Benutzeravatar
bala

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

Anthonys Benutzeravatar
Antonius

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

1111 1110

Dies erhalten Sie, indem Sie die binäre Darstellung einer Zahl nehmen, ihr Komplement bilden (alle Bits invertieren) und eins hinzufügen. Zwei beginnen als 0000 0010, und durch Invertieren der Bits erhalten wir 1111 1101. Durch Addieren von eins erhalten wir das obige Ergebnis. Das erste Bit ist das Vorzeichenbit und impliziert ein Negativ.

Schauen wir uns also an, wie wir ~2 = -3 erhalten:

Hier noch einmal zwei:

0000 0010

Drehen Sie einfach alle Teile um und wir erhalten:

1111 1101

Nun, wie sieht -3 im Zweierkomplement aus? Beginnen Sie mit positiv 3: 0000 0011, drehen Sie alle Bits auf 1111 1100 um und addieren Sie eins, um einen negativen Wert (-3) zu erhalten, 1111 1101.

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

Der Komplementoperator (~) dreht NUR BITS um. Es liegt an der Maschine, diese Bits zu interpretieren.

  • Eine andere Sache, die vielleicht erwähnt werden sollte, ist, dass die Umkehrung 1er-Komplement genannt wird, bevor die 1 hinzugefügt wird.

    – Chris S

    26. April 2009 um 19:31 Uhr

  • Es könnte anderen helfen, die das Einer- und Zweierkomplement nicht kennen. Lesen Sie hier mehr darüber. en.wikipedia.org/wiki/Ones%27_complement en.wikipedia.org/wiki/Two%27s_complement

    – Sai

    21. Dezember 2014 um 15:40 Uhr

  • Ist das nicht der bitweise NOT-Operator?

    – Braden Best

    20. Januar 2015 um 7:14

  • Woher weiß die Maschine, dass sie eine zweikomplementäre negative Zahl anstelle einer höheren positiven Zahl erhält? Liegt es am Typsystem der jeweiligen Sprache, das darauf hinweist, dass es sich bei dem Typ um einen vorzeichenbehafteten int-Typ oder um einen vorzeichenlosen Typ handelt?

    – GL2014

    20. Februar 2016 um 22:05 Uhr

  • @GL2014 Ich denke, Sie haben dort Ihre eigene Frage beantwortet. Soweit ich weiß, ist es die Art und Weise, wie die Maschine überhaupt funktionieren sollte.

    – geekidharsh

    29. Juli 2018 um 19:45 Uhr

Benutzeravatar von driis
Dris

~ dreht die Bits im Wert um.

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

2 ist also der Binärwert

00000010

Und ~2 dreht die Bits um, sodass der Wert jetzt ist:

11111101

Das ist die binäre Darstellung von -3.

  • Ist 11111101 == dezimal 253 vs. -3?

    – AKS

    7. August 2016 um 10:00 Uhr

  • Hängt davon ab, ob es sich um eine vorzeichenbehaftete oder vorzeichenlose Ganzzahl handelt.

    – Dris

    7. August 2016 um 17:50 Uhr

  • Welchen Nutzen hat es in der realen Programmierung? Gibt es Anwendungen in der Wettbewerbsprogrammierung?

    – Jdeep

    17. Juli 2020 um 15:55 Uhr


  • @driis, System.out.println((byte)(~2)); Gibt immer noch -3 statt 253 aus. Können Sie erklären, warum?

    – Reißverschluss

    16. Januar 2021 um 1:29

  • Byte ist ein vorzeichenbehafteter Typ, der Bereich liegt zwischen -128 und 127

    – za-ek

    25. November 2021 um 19:58 Uhr

Wie andere bereits erwähnt haben ~ einfach Bits umgedreht (ändert eins in null und null in eins) und seitdem Zweierkomplement verwendet wird, erhalten Sie das Ergebnis, das Sie gesehen haben.

Eine Sache, die ich hinzufügen muss, ist Warum Das Zweierkomplement wird verwendet, damit die Operationen für negative Zahlen die gleichen sind wie für positive Zahlen. Denk an -3 als die Zahl, zu der 3 addiert werden sollte, um Null zu erhalten, und Sie werden sehen, dass diese Zahl ist 1101Denken Sie daran, dass die binäre Addition genau wie die Addition in der Grundschule (Dezimal) ist, nur dass Sie eins tragen, wenn Sie zwei statt 10 erreichen.

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

Deshalb 1101 Ist -3drehe die Teile um, die du erhältst 0010 Das sind zwei.

Diese Operation ist eine Ergänzung, keine Negation.

Bedenken Sie, dass ~0 = -1 ist, und arbeiten Sie von dort aus.

Der Algorithmus zur Negation lautet „Komplement, Inkrement“.

Wussten Sie? Es gibt auch das „Einerkomplement“, bei dem die umgekehrten Zahlen vorliegen Sind symmetrisch und hat sowohl eine 0 als auch eine -0.

Ich weiß, dass die Antwort auf diese Frage schon vor langer Zeit veröffentlicht wurde, aber ich wollte meine Antwort darauf mitteilen.

Um das Einerkomplement einer Zahl zu finden, ermitteln Sie zunächst deren binäres Äquivalent. Hier eine Dezimalzahl 2 wird dargestellt als 0000 0010 in binärer Form. Nehmen wir nun das Einserkomplement, indem wir alle Ziffern seiner Binärdarstellung invertieren (alle Einsen in Nullen und alle Nullen in Einsen umdrehen), was zu Folgendem führt:

0000 0010 → 1111 1101

Dies ist das Einerkomplement der Dezimalzahl 2. Und da das erste Bit, also das Vorzeichenbit, in der Binärzahl 1 ist, bedeutet dies, dass das Vorzeichen 1 ist Negativ für die gespeicherte Nummer. (hier ist die Nummer gemeint nicht 2, aber das Einerkomplement von 2).

Da die Zahlen nun als 2er-Komplement gespeichert werden (wobei das Einerkomplement einer Zahl plus eins genommen wird), um diese Binärzahl anzuzeigen, 1111 1101in Dezimalzahl, müssen wir zuerst das Zweierkomplement finden, das sein wird:

1111 1101 → 0000 0010 + 1 → 0000 0011

Das ist das 2er-Komplement. Die dezimale Darstellung der Binärzahl, 0000 0011Ist 3. Und da das Vorzeichenbit, wie oben erwähnt, eins war, lautet die resultierende Antwort auch -3.

Hinweis: Wenn Sie dieses Verfahren sorgfältig gelesen haben, werden Sie feststellen, dass das Ergebnis für den Einerkomplement-Operator tatsächlich die Zahl (Operand – auf den dieser Operator angewendet wird) plus eins mit einem negativen Vorzeichen ist. Sie können dies auch mit anderen Nummern versuchen.

  • Warum wird zweimal hinzugefügt? ich sehe add, flip, add. 0010 -> 0011 -> 1100 -> 1101

    – Braden Best

    20. Januar 2015 um 7:45 Uhr


  • Es heißt umdrehen, umdrehen, hinzufügen. Erster Flip für das 1er-Komplement. Und da sie im System im 2er-Komplement gespeichert ist, wird beim Anzeigen der Zahl das 2er-Komplement der gespeicherten Zahl angezeigt (z. B. zweites Umdrehen und Addieren).

    – Himanshu Aggarwal

    21. Januar 2015 um 14:45 Uhr


  • Aber wäre flip(flip(2)) nicht einfach 2? 0010 1101 0010

    – Braden Best

    21. Januar 2015 um 18:24

  • Ja, es werden nur 2 sein. Da die Bits jedoch im Speicher gespeichert wurden, war das höchstwertige Bit 1, wodurch die Zahl später negativ wird, wie in der Antwort oben erläutert.

    – Himanshu Aggarwal

    22. Januar 2015 um 7:40 Uhr

  • Nach dem, was Sie beschreiben und nach allem, was ich recherchiert habe, handelt es sich hierbei nicht um ein Zweierkomplement, sondern um ein „normales“ Komplement oder ein bitweises NICHT. In der Logik, NOT 0 = 1 Und NOT 1 = 0. In einem Vier-Bit-System NOT 0011 (3) = 1100 (12 ohne Vorzeichen, -4 mit Vorzeichen). Soweit ich weiß, ist Zweierkomplement definiert als (NOT n) + 1, und wird verwendet, um das negative Gegenstück einer Zahl unabhängig von der Anzahl der Bits zu finden. Daher, 2c(5) = -5. Sehen Sie, jetzt macht es vollkommen Sinn. Solange Sie diese Operation als das bezeichnen, was sie ist: ein bitweises NICHT.

    – Braden Best

    7. Februar 2015 um 17:51


Benutzeravatar von Mike Aluydiav
Mike Aluydiav

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

„~“ einer beliebigen Ganzzahl in Java stellt das 1er-Komplement der Zahl dar. Ich nehme zum Beispiel ~4, was in binärer Darstellung 0100 bedeutet. Erstens beträgt die Länge einer Ganzzahl vier Bytes, dh 4*8 (8 Bits für 1 Byte) = 32. Im Systemspeicher wird 4 also als 0000 0000 0000 0000 0000 0000 0000 0100 dargestellt. Der Operator führt nun das 1er-Komplement für die obige Binärzahl aus

Das heißt, 1111 1111 1111 1111 1111 1111 1111 1011->1-Komplement, das höchstwertige Bit stellt das Vorzeichen der Nr. dar (entweder – oder +). Wenn es 1 ist, ist das Vorzeichen „-“, wenn es 0 ist, ist das Vorzeichen „+“ gemäß Dies ist unser Ergebnis eine negative Zahl. In Java werden die negativen Zahlen in Zweierkomplementform gespeichert. Das erfasste Ergebnis müssen wir in Zweierkomplement umwandeln (führen Sie zuerst das Einsenkomplement durch und addieren Sie einfach 1 zum Einserkomplement). Alle Einsen werden zu Nullen, mit Ausnahme des höchstwertigen Bits 1 (das unsere Vorzeichendarstellung der Zahl ist, d. h. für die verbleibenden 31 Bits 1111 1111 1111 1111 1111 1111 1111 1011 (erworbenes Ergebnis des ~-Operators) 1000 0000 0000 0000 0000 0000 0000 0100 (1er-Komplement)

1 (2er-Komplement)

1000 0000 0000 0000 0000 0000 0000 0101 Jetzt ist das Ergebnis -5. Schauen Sie sich diesen Link für das Video an <[Bit wise operators in java] https://youtu.be/w4pJ4cGWe9Y

  • Warum wird zweimal hinzugefügt? ich sehe add, flip, add. 0010 -> 0011 -> 1100 -> 1101

    – Braden Best

    20. Januar 2015 um 7:45 Uhr


  • Es heißt umdrehen, umdrehen, hinzufügen. Erster Flip für das 1er-Komplement. Und da sie im System im 2er-Komplement gespeichert ist, wird beim Anzeigen der Zahl das 2er-Komplement der gespeicherten Zahl angezeigt (z. B. zweites Umdrehen und Addieren).

    – Himanshu Aggarwal

    21. Januar 2015 um 14:45 Uhr


  • Aber wäre flip(flip(2)) nicht einfach 2? 0010 1101 0010

    – Braden Best

    21. Januar 2015 um 18:24

  • Ja, es werden nur 2 sein. Da die Bits jedoch im Speicher gespeichert wurden, war das höchstwertige Bit 1, wodurch die Zahl später negativ wird, wie in der Antwort oben erläutert.

    – Himanshu Aggarwal

    22. Januar 2015 um 7:40 Uhr

  • Nach dem, was Sie beschreiben und nach allem, was ich recherchiert habe, handelt es sich hierbei nicht um ein Zweierkomplement, sondern um ein „normales“ Komplement oder ein bitweises NICHT. In der Logik, NOT 0 = 1 Und NOT 1 = 0. In einem Vier-Bit-System NOT 0011 (3) = 1100 (12 ohne Vorzeichen, -4 mit Vorzeichen). Soweit ich weiß, ist Zweierkomplement definiert als (NOT n) + 1, und wird verwendet, um das negative Gegenstück einer Zahl unabhängig von der Anzahl der Bits zu finden. Daher, 2c(5) = -5. Sehen Sie, jetzt macht es vollkommen Sinn. Solange Sie diese Operation als das bezeichnen, was sie ist: ein bitweises NICHT.

    – Braden Best

    7. Februar 2015 um 17:51


Einfach ………..

Als 2er-Komplement einer beliebigen Zahl können wir rechnen, indem wir alle Einsen in Nullen umkehren und umgekehrt und dann 1 dazuaddieren.

Hier liefert N= ~N immer Ergebnisse -(N+1). Weil das System Daten in Form eines Zweierkomplements speichert, was bedeutet, dass es ~N auf diese Weise speichert.

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

Zum Beispiel::

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

Jetzt kommt der Punkt, von dem Minus kommt. Meiner Meinung nach haben wir ein 32-Bit-Register, was bedeutet, dass 2^31 -1 Bit an der Operation beteiligt sind, und dass ein Bit, das sich in früheren Berechnungen ändert (Komplement), als Vorzeichenbit gespeichert wird, das normalerweise 1 ist. Und wir erhalten das Ergebnis ~10 = -11.

~(-11) =10 ;

Das Obige gilt, wenn printf(“%d”,~0); wir erhalten das Ergebnis: -1;

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

1450170cookie-checkWie funktioniert der bitweise Komplementoperator (~ Tilde) von Python?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy