C#位运算详解(图文并茂,附带实例)
所谓位运算,指的是一连串二进制数间的一种运算,C# 语言所提供的位运算符如下所示。
在上述表达式中,a 和 b 可以是 int、uint、long 或 ulong 整数。若是 int 整数变量 a 的值是 25,则它在系统中真正的值如下所示:
可以得到最后的值是 9。
【实例】& 位运算的基本应用。
假设 a=3 和 b=8 则执行 a|b 结果如下所示:
可以得到执行结果是 11(十进制值)。
【实例】基本 | 运算。
假设 a=3 和 b=8,则执行 a^b 之后结果如下所示:
可以得到执行结果是 11(十进制值)。
【实例】基本 ^ 运算符的程序应用。
也就是说,这个运算会将位 1 转变为 0,位 0 改变成 1。
假设 a=7,则执行 ~a 之后的结果如下所示:
【实例】~运算符的基本运算。
假设有一个变量 a=7,则执行 a<<1 之后的结果如下所示:
所以最后 a 的值是 14。从以上实例中也可以看到,这个指令兼具有将变量值乘 2 的功能。
【实例】位左移的基本程序运算。
假设有一个变量 a=14,则执行 a>>1 之后结果如下所示:
所以最后 a 的值是 7。从以上实例中也可以看到,如果变量值是偶数,这个指令兼具有将变量值除 2 的功能。
【实例】位右移的基本程序运算。
例如:x&=y 相当于:
符号 | 意义 |
---|---|
& | 相当于 AND 运算 |
| | 相当于 OR 运算 |
^ | 相当于 XOR 运算 |
~ | 按位取反 |
<< | 位左移 |
>> | 位右移 |
C# &运算符
在位运算符号的定义中,& 和英文 and 的意义是一样的,& 的基本位运算如下所示:a | b | a & b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
在上述表达式中,a 和 b 可以是 int、uint、long 或 ulong 整数。若是 int 整数变量 a 的值是 25,则它在系统中真正的值如下所示:
a = 0000 0000 0000 0000 0000 0000 0001 1001假设另一 int 整数变量 b 的值是 77,则它在系统中真正的值是:
b = 0000 0000 0000 0000 0000 0000 0100 1101假设 a、b 变量的值如上所示,且有一指令如下:
a & b可以得到下列结果:

可以得到最后的值是 9。
【实例】& 位运算的基本应用。
int a = 25; int b = 77; int c = a & b; Console.WriteLine($"a = {Convert.ToString(a,2)}"); Console.WriteLine($"b = {Convert.ToString(b,2)}"); Console.WriteLine($"a & b = {Convert.ToString(c,2)}"); Console.WriteLine($"a & b = {c}"); uint x = 0b_1111_1000; uint y = 0b_1001_1101; uint z = x & y; Console.WriteLine($"x = {Convert.ToString(x, 2)}"); Console.WriteLine($"y = {Convert.ToString(y, 2)}"); Console.WriteLine($"x & y = {Convert.ToString(z, 2)}");执行结果为:
a = 11001 b = 1001101 a & b = 1001 a & b = 9 x = 11111000 y = 10011101 x & y = 10011000
C# |运算符
在位运算符号的定义中,|
和英文的 or 意义是一样的,它的基本位运算如下所示。a | b | a | b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
假设 a=3 和 b=8 则执行 a|b 结果如下所示:

可以得到执行结果是 11(十进制值)。
【实例】基本 | 运算。
int a, b; a = 32; b = a | 3; Console.WriteLine($"a | 3 (十进制) = {b}"); b |= 7; Console.WriteLine($"b | 7 (十进制) = {b}"); uint x = 0b_1010_0000; uint y = 0b_1001_0001; uint z = x | y; Console.WriteLine($"x = {Convert.ToString(x, 2)}"); Console.WriteLine($"y = {Convert.ToString(y, 2)}"); Console.WriteLine($"x | y = {Convert.ToString(z, 2)}");执行结果为:
a | 3 (十进制) = 35 b | 7 (十进制) = 39 x = 10100000 y = 10010001 x | y = 10110001前 7 行程序执行说明如下:

C# ^运算符
在位运算符号的定义中,^和英文的 xor 的意义是一样的,它的基本位运算如下所示。a | b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
假设 a=3 和 b=8,则执行 a^b 之后结果如下所示:

【实例】基本 ^ 运算符的程序应用。
int a, b; a = 31; b = 63; Console.WriteLine($"a ^ b (十进制) = {a^b}"); uint x = 0b_1111_1000; uint y = 0b_0001_1100; uint z = x ^ y; Console.WriteLine($"x = {Convert.ToString(x, 2)}"); Console.WriteLine($"y = {Convert.ToString(y, 2)}"); Console.WriteLine($"x ^ y = {Convert.ToString(z, 2)}");执行结果为:
a ^ b (十进制) = 32 x = 11111000 y = 11100 x ^ y = 11100100程序前 5 行执行说明如下:

C# ~运算符
这个位运算符相当于按位取反,和其他运算符不同的是,它只需要一个运算符,它的基本运算格式下所示。a | ~ a |
---|---|
1 | 0 |
0 | 1 |
也就是说,这个运算会将位 1 转变为 0,位 0 改变成 1。
假设 a=7,则执行 ~a 之后的结果如下所示:

【实例】~运算符的基本运算。
int a, b; a = 7; b = ~a; Console.WriteLine($"a 的 1 补码 (十进制) = {b}"); Console.WriteLine($"a 的 1 补码 (十六进制) = {Convert.ToString(b,16)}"); uint x = 0b_0000_1111_0000_1111_0000_1111_0000_1100; uint y = ~x; Console.WriteLine($"x = {Convert.ToString(x, 2)}"); Console.WriteLine($"y = {Convert.ToString(y, 2)}");执行结果为:
a 的 1 补码 (十进制) = -8
a 的 1 补码 (十六进制) = fffffff8
x = 1111 0000 1111 0000 1111 0000 1100
y = 1111 0000 1111 0000 1111 0000 1111 0011
C# <<运算符
<< 是位左移的运算符,它的执行情形如下所示:
假设有一个变量 a=7,则执行 a<<1 之后的结果如下所示:

所以最后 a 的值是 14。从以上实例中也可以看到,这个指令兼具有将变量值乘 2 的功能。
【实例】位左移的基本程序运算。
int a, b; a = 7; b = a << 1; Console.WriteLine($"a 的(二进制) = {Convert.ToString(a, 2)}"); Console.WriteLine($"a << 1(二进制)= {Convert.ToString(b, 2)}"); b = a << 3; Console.WriteLine($"a << 3(二进制)= {Convert.ToString(b, 2)}"); uint x = 0b_1100_1001_0000_0000_0000_0000_0001_0001; Console.WriteLine($"x = {Convert.ToString(x, 2)}"); uint y = x << 4; Console.WriteLine($"x << 4 = {Convert.ToString(y, 2)}");执行结果为:
a 的(二进制) = 111 a << 1(二进制)= 1110 a << 3(二进制)= 1110000 x = 1100 1001 0000 0000 0000 0000 0001 0001 x << 4 = 1001 0000 0000 0000 0001 0001 0000程序中,第 7 行左移 3 个位的说明如下:

C# >>运算符
>> 是一个位右移的运算符,它的执行情形如下所示。
假设有一个变量 a=14,则执行 a>>1 之后结果如下所示:

所以最后 a 的值是 7。从以上实例中也可以看到,如果变量值是偶数,这个指令兼具有将变量值除 2 的功能。
【实例】位右移的基本程序运算。
int a, b; a = 14; b = a >> 1; Console.WriteLine($"a 的(二进制) = {Convert.ToString(a, 2)}"); Console.WriteLine($"a >> 1(二进制)= {Convert.ToString(b, 2)}"); b = a >> 3; Console.WriteLine($"a >> 3(二进制)= {Convert.ToString(b, 2)}"); uint x = 0b_1001; Console.WriteLine($"x = {Convert.ToString(x, 2)}"); uint y = x >> 2; Console.WriteLine($"x >> 2 = {Convert.ToString(y, 2)}");执行结果为:
a 的(二进制) = 1110 a >> 1(二进制)= 111 a >> 3(二进制)= 1 x = 1001 x >> 2 = 10
C#位运算相关的复合表达式
我们也可以将下列复合表达式应用在位运算上:复合表达式 | 基本表达式 |
---|---|
i &= j; | i = i & j; |
i |= j; | i = i | j; |
i ^= j; | i = i ^ j; |
i >>= j; | i = i >> j; |
i <<= j; | i = i << j; |
例如:x&=y 相当于:
x = x & y;再例如,x>>=5 相当于:
x = x >> 5;