2016-06-17 15 views
2

Warum gibt C# 's bitweise NOT den Operator (the_number*-1)-1 zurück?C# NOT (~) bitweiser Operator gibt negative Werte zurück

byte a = 1; 
Console.WriteLine(~a); //equals -2 
byte b = 9; 
Console.WriteLine(~b); //equals -10 
// Shouldn't a=0 and b=6? 

Wie würde ich das in C# tun?

9 = 0b1001 -> NOT 
    = 0b0110 = 6 
+4

Sie erkennen, dass "Byte" hat 8 Bits, also die binäre Darstellung von 9 ist 0b00001001? – Timbo

+0

-2 ist eigentlich in Ordnung, da ints verwenden ... nun, @knittl sagte es gerade unten. – Shark

+0

Dies ist nicht spezifisch für C# - die CPUs selbst arbeiten auf diese Weise –

Antwort

6

bitweise Operationen geben einen Wert vom Typ int (sig). Signed Ganzzahlen verwenden Two's-Komplement, um negative Zahlen darzustellen. Die Zeichenerweiterung wird verwendet, wenn von Byte zu Int gewechselt wird.

byte a = 1; // 0b00000001 
int notA = ~a; // 0b11111110 = -128 + 64 + 32 + 16 + 8 + 4 + 2 = -2 (actually 0b11111111 11111111 11111111 11111110) 

byte b = 9; // 0b00001001 
int notB = ~9; // 0b11110110 = -128 + 64 + 32 + 16 + 4 + 2 = -10 (actually 0b11111111 11111111 11111111 11110110) 

Casting zurück zu Byte geben Ihnen die "erwartete" Ergebnis für 0b11110110

byte notB = unchecked((byte)(~b)); // 0b11110110 = 128 + 64 + 32 + 16 + 4 + 2 
Console.WriteLine(notB); // 246 
2

Sie haben vergessen, dass die führenden Bits auch invertiert:

00001001 
NOT 
11110110 

Es sieht aus wie Sie wollen zu Maske die:

byte b = 9; 
Console.WriteLine(~b & 0xf); // should output 6