2016-06-17 10 views
2

なぜC#のビット単位でNOT演算子を返します(the_number*-1)-1C#NOT(〜)ビットワイズ演算子が負の値を返す

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

これをC#でどうやって行いますか?

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

「バイト」は8ビットであることが分かります。したがって、バイナリ表現は9で、0b00001001ですか? – Timbo

+0

-2は実際には大丈夫です。なぜなら、intsは...よく使うので、@knittlはちょうどそれを以下に述べました。 – Shark

+0

これはC#に固有のものではなく、CPU自体がこのように動作します –

答えて

6

ビット演算は、int(符号付き)の値を返します。符号付き整数は、負数を表すためにの2の補数を使用します。符号拡張は、バイトからintに行くときに使用されます。

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) 

バイトに戻ってキャストすると、あなたが先行ビットも反転していることを忘れてしまった0b11110110

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

ための「期待」結果得られます:あなたが望むように

00001001 
NOT 
11110110 

に見えますが〜マスクこれらは、

byte b = 9; 
Console.WriteLine(~b & 0xf); // should output 6 
関連する問題