首页 > 编程笔记 > C#笔记 阅读:16

C#位运算详解(图文并茂,附带实例)

所谓位运算,指的是一连串二进制数间的一种运算,C# 语言所提供的位运算符如下所示。

符号 意义
& 相当于 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 之后结果如下所示:

可以得到执行结果是 11(十进制值)。

【实例】基本 ^ 运算符的程序应用。
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;

相关文章