2010-08-11 12 views
10

Ich versuche Einerkomplement von 0 bis nehmen Sie 1 zu bekommen, aber ich bekomme 4294967295 Hier ist, was ich getan habe, ist:Weird-Ausgang für bitweise NICHT

unsigned int x = 0; 
unsigned int y= ~x; 
cout << y; 

Meine Ausgabe ist 4294967295, aber ich erwarte, dass 1, warum das so?. Übrigens, ich mache das in C++.

+0

1s Komplement ist abhängig von der Anzahl der Bits in der Sache, die Sie die eine Ergänzung finden. Das definierende Merkmal der Ergänzung ist, dass Sie zwei Zahlen haben, die beide Null sind. Die Negationsoperation in 1s-Komplement entspricht dem bitweise nicht-Operator, wie Sie beobachtet haben. Ich denke du hast eine falsche Vorstellung davon, wie 1s Komplement funktioniert. – Omnifarious

Antwort

21

Warum erwarten Sie 1? Bit-weise Komplement flips alle die Bits.

00000000000000000000000000000000 = 0 
       | 
      bitwise NOT 
       | 
       v 
11111111111111111111111111111111 = 4294967295 

Vielleicht denken Sie an eine logical NOT. In C++ wird dies als !x geschrieben.

0

Eine ganze Zahl ist mehr als nur 1 Bit (es sind 4 Bytes oder 32 Bits). Wenn Sie es notieren, drehen Sie alles um, in diesem Fall wird 00000 ... zu 11111 ...

0

~ dreht alle Bits im Eingang um. Ihre Eingabe ist ein vorzeichenloser int, der 32 Bits hat, von denen alle 0 sind. Wenn Sie jedes dieser 0-Bits umkehren, erhalten Sie stattdessen 32 1-Bits, was für diese große Zahl binär ist.

Wenn Sie nur das niedrigstwertige Bit umkehren möchten, können Sie y = x^1 verwenden, also stattdessen XOR verwenden.

2

Woher haben Sie die Erwartung von 1 bekommen?

Ihr Verständnis für bitweise Operationen eindeutig fehlt zeigt ist, wäre es klug, durch sie in hier zuerst zu arbeiten, bevor veröffentlichen ...

Sie nicht mit einem verwirrend! was ist ein logisches NICHT, oder?

a ~ bitweise Komplement oder ein bitweises NOT-Operation die Bits alle kehrt von 1 auf 0 und umge Flips abhängig davon, wo in der Bitmaske gesetzt ist, so beispielsweise ein 1

 
00000000 00000000 00000000 00000001 

ist tut eine ~ bitweise NICHT auf das klappt es

 
11111111 11111111 11111111 11111110 

, die Ihnen den Maximalwert kleine 1 des ganzzahligen Datentypen auf einem 32-Bit-System gibt.

Hier ist ein würdiger Link zu diesem, der Ihnen zeigt, wie man bit-twiddling hier macht.

4

Sie müssen dies im Binärformat betrachten, um genau zu verstehen, was passiert.

unsigned int x = 0, ist 00000000 00000000 00000000 00000000 im Speicher.

Die ~x Anweisung Flips alle Bits, die oben Windungen in Bedeutung:

11111111 11111111 11111111 11111111

welches in Dezimalform bis 4294967295 umwandelt.

Mit XOR können Sie nur bestimmte Bits spiegeln. Wenn Sie nur das niedrigstwertige Bit umkehren möchten, verwenden Sie stattdessen x^1.

0

können Sie verwenden

unsigned int y= !x; 

y = 1 zu erhalten;