C# - 位运算符
C# 位运算符允许进行二进制级别的运算。这些运算符主要用于性能优化、底层编程、加密、网络和系统编程。
C# 中的位运算符是什么?
C# 位运算符操作数字的各位。这些运算符通常用于高效计算、标志位运算和硬件交互。
C# 位运算符列表
下表列出了 C# 支持的位运算符。假设变量 A 为 60,变量 B 为 13,则 −
运算符 | 说明 | 示例 |
---|---|---|
& | 如果二进制"与"运算符在两个操作数中都存在,则将一位复制到结果中。 | (A & B) = 12,即 0000 1100 |
| | 如果二进制"或"运算符在任意一个操作数中都存在,则将一位复制到结果中。操作数。 | (A | B) = 61,即 0011 1101 |
^ | 二进制异或运算符复制一个操作数中设置了位的位,但两个操作数均设置了位。 | (A ^ B) = 49,即 0011 0001 |
~ | 二进制一补码运算符是一元运算符,具有"翻转"位的效果。 | (~A ) = -61,由于它是一个有符号二进制数,因此在二进制补码中为 1100 0011。 |
<< | 二进制左移运算符。左侧操作数的值按右侧操作数指定的位数向左移动。 | A << 2 = 240,即 1111 0000 |
>> | 二进制右移运算符。左侧操作数的值按右侧操作数指定的位数向右移动。 | A >> 2 = 15,即 0000 1111 |
通过示例理解位运算
示例 1:位与 (&)
位与运算仅当两个操作数在该位置都为 1 时,才会将每个位设置为 1。
using System; class Program { static void Main() { int a = 5, b = 3; // Binary: a = 0101, b = 0011 int result = a & b; // 0101 & 0011 = 0001 (1) Console.WriteLine("Bitwise AND: " + result); } }
当编译并执行上述代码时,它会产生以下结果 -
Bitwise AND: 1
示例 2:按位或 (|)
按位或运算中,若任一操作数为 1,则将每位设置为 1。
using System; class Program { static void Main() { int a = 5, b = 3; // Binary: a = 0101, b = 0011 int result = a | b; // 0101 | 0011 = 0111 (7) Console.WriteLine("Bitwise OR: " + result); } }
当编译并执行上述代码时,它会产生以下结果 -
Bitwise OR: 7
示例 3:按位异或 (^)
按位异或运算会将相应位设置为 1(如果相应位不同)。
using System; class Program { static void Main() { int a = 5, b = 3; // Binary: a = 0101, b = 0011 int result = a ^ b; // 0101 ^ 0011 = 0110 (6) Console.WriteLine("Bitwise XOR: " + result); } }
当编译并执行上述代码时,它会产生以下结果 -
Bitwise XOR: 6
示例 4:按位非 (~)
按位非会取反每个位(将 1 变为 0,反之亦然)。
using System; class Program { static void Main() { int a = 5; // Binary: 00000101 int result = ~a; // NOT 00000101 = 11111010 (Twos Complement) Console.WriteLine("Bitwise NOT: " + result); } }
当编译并执行上述代码时,它会产生以下结果 -
Bitwise NOT: -6
示例 5:左移 (<<)
左移 (<<) 将位向左移动,使数字乘以 2^n。
using System; class Program { static void Main() { int a = 5; // Binary: 00000101 int result = a当编译并执行上述代码时,它会产生以下结果 -
Left Shift: 20示例 6:右移 (>>)
右移 (>>) 将位向右移动,将数字除以 2^n。
using System; class Program { static void Main() { int a = 20; // Binary: 00010100 int result = a >> 2; // Right Shift by 2: 00000101 (5) Console.WriteLine("Right Shift: " + result); } }当编译并执行上述代码时,它会产生以下结果 -
Right Shift: 5位运算符的实际应用
示例 7:检查数字是偶数还是奇数
您可以使用按位与运算来确定数字是偶数还是奇数。
using System; class Program { static void Main() { int number = 10; if ((number & 1) == 0) Console.WriteLine("Even"); else Console.WriteLine("Odd"); } }当编译并执行上述代码时,它会产生以下结果 -
Even示例 8:不使用临时变量交换两个数字
您可以使用按位异或运算符交换两个数字,而无需额外的内存。
using System; class Program { static void Main() { int a = 5, b = 10; a = a ^ b; b = a ^ b; a = a ^ b; Console.WriteLine("After Swap: a = " + a + ", b = " + b); } }当编译并执行上述代码时,它会产生以下结果 -
After Swap: a = 10, b = 5常见错误及避免方法
错误 问题 解决方案 a << -1 负移位计数 使用 a << 0 或 a >> 0 a = a & 0; 始终将 a 设置为 0 确保 a &正确设置掩码的掩码 b = ~b; 意外负值 理解二进制补码表示 C# 位运算符最佳实践
- 使用位与 (&) 进行标志运算和位掩码运算。
- 使用异或 (^) 高效交换值。
- 使用移位运算符 (<< 和 >>) 快速进行 2 的幂乘除运算。
- 理解负数如何以二进制补码格式表示。