Erste Schritte Operatoren zur Manipulation von Bits "~"

dan1996

Aktives Mitglied
Guten Tag, ich habe hier eine Aufgabe doch mich verwirrt das ~ Zeichen, kann mir jemand erklären oder vorrechnen warum z.B. ~3 = -4 ist ?

Aufgabe:
int x = 12
(x - ~3)
 
~ invertiert alle Bits. Das heißt, aus:
3 = 00000000000000000000000000000011
wird:
-4 = 11111111111111111111111111111100
Weitere negative Zahlen:
-1 = 11111111111111111111111111111111
-2 = 11111111111111111111111111111110
-3 = 11111111111111111111111111111101
Dazu sei noch gesagt, dass vorzeichenbehaftete Ganzzahlen im Zweierkomplement interpretiert werden.
(rot ist das Vorzeichenbit)
 
Danke, kurze frage noch dazu aus 3 wird ja 11 aber wie viele nullen muss man davor schreiben und wie wandelt man die binärzahl (11111111111111111111111111111100)in dezimal um
 
Wenn du weißt, dass es sich bei der Binärzahl um eine Ganzzahl in Zweierkomplement-Darstellung handelt, schaust du zuerst einmal auf das höchstwertigste Bit (das ganz links). Wenn das 1 ist (ist es in diesem Fall), dann weißt du, dass es sich bei der Zahl schonmal um eine negative Zahl handelt.
Jetzt wandelst du die Binärdarstellung erstmal in ihre positive Darstellung um, indem du alle Bits umdrehst und dann 1 addierst:
Code:
 11111111111111111111111111111100 | ~
 00000000000000000000000000000011 | +1
 00000000000000000000000000000100
Jetzt kannst du, wenn du willst, einfach erstmal alle führenden Nullen entfernen (genauso wie bei einer Dezimalzahl):
Code:
 00000000000000000000000000000100 | entferne führende Nullen
                              100
Jetzt weißt du ja, dass diese Binärdarstellung einer Zahl sich aus 1*2² + 0*2¹ + 0*2⁰ zusammensetzt.
Genauso wie sich z.B. die Dezimalzahl 432 aus 4*10² + 3*10¹ + 2*10⁰ zusammensetzt. Und dann addierst du die Terme einfach und kommst auf -4 (minus 4, weil wir uns ja ganz am Anfang gemerkt hatten, dass es sich ursprünglich um eine negative Zahl handelte, wegen dem Vorzeichenbit = 1).
 
Das ist alles schon in der Antwort von @httpdigest enthalten. Du könntest z. B. die Bits zählen und wirst dann auf 32 kommen, weil in Java int ein 32-Bit-Datentyp ist. Die Umwandlung erfolgt durch Bildung des Zweierkomplements -> Wikipedia.

Nachtrag: hat sich mit Post von @httpdigest überschnitten - damit hast Du auch schon die Erklärung bekommen.
 

Zurück
Oben