位运算符详解

在 C 语言中,位运算符(Bitwise Operators)用于对整数类型(如 int, unsigned int, long, char 等)的二进制位进行操作。这些操作比算术运算更底层,常用于嵌入式开发、驱动开发、图像处理、网络协议、加密等场景。

下面是 C 语言中所有的位运算符及其详解:


一、位运算符列表

运算符 名称 功能说明
& 位与(AND) 两个二进制位都为1,结果才为1
` ` 位或(OR)
^ 位异或(XOR) 两个二进制位不同,结果为1;相同则为0
~ 位取反(NOT) 把每一个二进制位取反(0变1,1变0)
<< 左移 把二进制位向左移动n位,右侧补0
>> 右移 把二进制位向右移动n位,左侧视符号位补0或补1(有符号类型)


二、详细说明与示例

1️⃣ 位与 &

int a = 6;  // 00000110
int b = 3;  // 00000011
int c = a & b;  // 00000010 => 2

说明:只有两个数的对应位都为1时结果才为1。

用途:常用于**位掩码(mask)**操作,比如提取特定位。


2️⃣ 位或 |

int a = 6;  // 00000110
int b = 3;  // 00000011
int c = a | b;  // 00000111 => 7

说明:只要有一位为1,结果就是1。

用途:常用于设置某些位为1


3️⃣ 位异或 ^

int a = 6;  // 00000110
int b = 3;  // 00000011
int c = a ^ b;  // 00000101 => 5

说明:相同为0,不同为1

用途:

  • 清除相同的位

  • 交换两个值而不用临时变量(见技巧)


4️⃣ 位取反 ~

int a = 6;  // 00000110
int b = ~a; // 11111001 (补码) => -7

说明:每一位都取反。

注意:结果是补码形式,需注意符号位。


5️⃣ 左移 <<

int a = 3;      // 00000011
int b = a << 1; // 00000110 => 6

说明:相当于 乘以2的n次方,比如 a << 3 等价于 a * 8


6️⃣ 右移 >>

int a = 8;       // 00001000
int b = a >> 2;  // 00000010 => 2

说明:相当于 除以2的n次方,对正数效果一致。

⚠️ 有符号数右移时,符号位可能会扩展(即负数右移高位补1),称为算术右移。而无符号数右移通常为逻辑右移(高位补0)。


三、常见位运算技巧

✅ 检查某位是否为 1

if (a & (1 << n)) {
    // 第 n 位是 1
}

✅ 设置某一位为 1

a |= (1 << n);

✅ 清除某一位(置为0)

a &= ~(1 << n);

✅ 取某一位的值(0 或 1)

int bit = (a >> n) & 1;

✅ 交换两个整数(不使用临时变量)

a = a ^ b;
b = a ^ b;
a = a ^ b;

四、位运算注意事项

  1. 只能用于整数类型,不能直接对浮点数、指针等进行位操作。

  2. 运算优先级较低,在表达式中建议使用括号明确运算顺序。

  3. 使用位移时,小心超出位数范围可能导致未定义行为。


五、实战例子:位掩码定义权限

#define READ    0x01  // 00000001
#define WRITE   0x02  // 00000010
#define EXECUTE 0x04  // 00000100

int permission = READ | WRITE;

// 检查是否有写权限
if (permission & WRITE) {
    printf("Can write\n");
}

// 关闭写权限
permission &= ~WRITE;

你可能感兴趣的:(位运算符详解)