C#NOT(〜)位智能运算符返回负值

时间:2016-06-17 12:25:07

标签: c# bitwise-operators bit

为什么C#的按位NOT运算符返回(the_number*-1)-1

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

2 个答案:

答案 0 :(得分:7)

按位运算返回类型int(已签名)的值。有符号整数使用二进制补码来表示负数。从byte到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

答案 1 :(得分:2)

你忘记了前导位也被反转了:

00001001
NOT
11110110

看起来你想掩盖那些:

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