2016-06-17 47 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

你知道'byte'有8位,因此二進制表示爲9是0b00001001? – Timbo

+0

-2實際上是正常的,因爲ints使用...呃,@ knittl只是在下面說的。 – Shark

+0

這不是特定於C#的CPU本身以這種方式工作 –

回答

6

按位運算返回值爲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