C#位运算符的用法(附带实例)
C# 中的位运算符有位与、位或、位异或和取反运算符,其中位与、位或、位异或运算符为双目运算符,取反运算符为单目运算符。
位运算符的操作数类型是整型,可以是有符号的,也可以是无符号的。
位运算是完全针对位方面的操作,因此,在实际使用时,它需要先将要执行运算的数据转换为二进制数,然后才能进行运算。
整型数据在内存中以二进制形式表示,如整型变量 7 的 32 位二进制数表示是:
负数采用补码表示,如 -8 的 32 位二进制数表示为:
“按位与”运算的运算法则是:如果两个整型数据 a 和 b 对应位都是 1,则结果位才是 1,否则为 0。
如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,如下图所示。

图 1 12&8的运算过程
“按位或”运算的运算法则是:如果两个操作数对应位都是 0,则结果位才是 0,否则为 1。
如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,如下图所示。

图 2 4|8的运算过程
“按位异或”运算的运算法则是:当两个操作数的二进制数表示相同(同时为 0 或同时为 1)时,结果为 0,否则为 1。
若两个操作数的精度不同,则结果数的精度与精度高的操作数相同,如下图所示:

图 3 31^22的运算过程
“取反”运算就是将操作数对应二进制数中的 1 修改为 0,0 修改为 1,如下图所示。

图 4 ~123的运算过程
在图 4 中,123 取反后得到的结果中,由于前面符号位为 1,因此最高位以负数计算,即 -27+22,所以结果为 -124。
在 C# 中使用 Console.WriteLine 输出图 1~图 4 的运算结果,主要代码如下:
位运算符的操作数类型是整型,可以是有符号的,也可以是无符号的。
位运算是完全针对位方面的操作,因此,在实际使用时,它需要先将要执行运算的数据转换为二进制数,然后才能进行运算。
整型数据在内存中以二进制形式表示,如整型变量 7 的 32 位二进制数表示是:
00000000 00000000 00000000 00000111其中,左边最高位是符号位,最高位是 0 表示正数,若为 1,则表示负数。
负数采用补码表示,如 -8 的 32 位二进制数表示为:
11111111 11111111 11111111 11111000
C#“按位与”运算
“按位与”运算的运算符为“&”。“按位与”运算的运算法则是:如果两个整型数据 a 和 b 对应位都是 1,则结果位才是 1,否则为 0。
如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,如下图所示。

图 1 12&8的运算过程
C#“按位或”运算
“按位或”运算的运算符为“|”。“按位或”运算的运算法则是:如果两个操作数对应位都是 0,则结果位才是 0,否则为 1。
如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,如下图所示。

图 2 4|8的运算过程
C#“按位异或”运算
“按位异或”运算的运算符是“^”。“按位异或”运算的运算法则是:当两个操作数的二进制数表示相同(同时为 0 或同时为 1)时,结果为 0,否则为 1。
若两个操作数的精度不同,则结果数的精度与精度高的操作数相同,如下图所示:

图 3 31^22的运算过程
C#“取反”运算
“取反”运算也称“按位非”运算,运算符为“~”。“取反”运算就是将操作数对应二进制数中的 1 修改为 0,0 修改为 1,如下图所示。

图 4 ~123的运算过程
在图 4 中,123 取反后得到的结果中,由于前面符号位为 1,因此最高位以负数计算,即 -27+22,所以结果为 -124。
在 C# 中使用 Console.WriteLine 输出图 1~图 4 的运算结果,主要代码如下:
Console.WriteLine("12与8的结果为:" + (12 & 8)); // “按位与”计算整数的结果 Console.WriteLine("4或8的结果为:" + (4 | 8)); // “按位或”计算整数的结果 Console.WriteLine("31异或22的结果为:" + (31 ^ 22)); // “按位异或”计算整数的结果 Console.WriteLine("123取反的结果为:" + ~123); // “按位取反”计算整数的结果 Console.ReadLine();运算结果为:
12与8的结果为:8
4或8的结果为:12
31异或22的结果为:9
123取反的结果为:-124