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 的幂乘除运算。
  • 理解负数如何以二进制补码格式表示。