2012-08-23 8 views
6

Ich bin wirklich hart versucht, die Bits in einem C int-Variable zu kippen. Ich mache es wie so:C bitweise Negation erzeugt negativen Ausgang:

input = 15; 

input = ~input; 

printf("%d", input); 

aber es zeigt immer als -16 UP. Es sollte 0 sein! wenn 15 als 1111 geschrieben ist, warum kehrt es 10000?! Das ist ja zum verrückt werden! Kann mir bitte jemand helfen !?

+0

Sie haben die Anführungszeichen im '% d' Format vergessen; Ich habe sie hinzugefügt. –

+0

danke .... Ich war etwas hysterisch und habe vergessen, das hinzuzufügen .... – Mizmor

+1

Es ist im Allgemeinen am besten, kopieren Sie und fügen Sie Ihren tatsächlichen Arbeitscode; das vermeidet Tippfehler und ähnliche Fehler sauber. –

Antwort

10

Da int auf Ihrem System ist wahrscheinlich eine 32-Bit-Zahl, werden alle Bits, einschließlich denjenigen, blättern die unbedeutenden Nullen in der ursprünglichen Zahl waren:

00000000000000000000000000001111 

11111111111111111111111111110000 

wird Dies ist eine negative Zahl: das höchstwertige Bit von 15 ist Null, also wird es 1, wenn es umgedreht wird.

Wenn Sie nur die Bits der ursprünglichen Nummer behalten möchten, müssen Sie mit allen Einsen in den wesentlichen Positionen der Zahl, wie dies zu maskieren:

printf("%d\n", input & 0xF); 

AND ing mit 0xF „abschneidet "Alle Bits außer den letzten vier.

+0

Okay, das erklärt meinen Fehler sehr gut! Jetzt muss ich nur einen Weg finden, nur die betroffenen Teile zu sehen. Meine Aufgabe ist es, 0 in der Darstellung einer Ganzzahl ohne die führenden Bits zu finden .... – Mizmor

2

15 ist vom Typ int. Je nachdem, wie groß int ist, endet die Darstellung von 15 in 1111, aber es beginnt mit einem Bündel von 0 s.

Der Operator ~ kippt alle die Bits; die 1 s (4 davon) werden 0 s und die 0 s (N-4 von ihnen) werden 1 s.

4

Dies geschieht, weil input von mehr als vier Bits besteht. Wenn wir davon ausgehen, dass input ist ein signed char, mit 8 Bit (oder ein Byte), dann gilt:

input == 15 == 0x0F == 0b00001111 

Wie Sie sehen können, die 4 höherwertigen Bits von input sind alle 0. Nach einer bitweise NOT-Operation (~), wir haben:

~input == -16 == 0xF0 == 0b11110000 

Die vier Bits, die früher Null waren, sind jetzt Einsen, und die sind jetzt Nullen. Das höchstwertige Bit in einer vorzeichenbehafteten Variablen bestimmt sein Vorzeichen (0 ist positiv und 1 ist negativ). Durch Umdrehen der Bits wurde das Vorzeichen umgekehrt.

1  1  1  1  0  0  0 0 
-128 + 64 + 32 + 16 + 0 + 0 + 0 + 0 

die die -16 löst, die gedruckt wurde: Die negative Zahl als gelesen werden.

Wenn Ihre Hausaufgabe darin besteht, eine Variable mit dem bitweisen NOT auf Null zu setzen, versuchen Sie, input als unsigned char zu deklarieren, damit Sie sich nicht um das Vorzeichen-Bit kümmern müssen. Dann setzte input zu 255, den höchsten Wert ein 8-Bit-Variable halten können (0xFF oder 0b11111111).