C语言中,位操作是一个非常常见且高效的方式来操作单个位,尤其是在处理硬件或低级别的系统编程时。通过位操作符,可以实现对特定位的设置(置1)、清除(置0)和翻转(取反)。

1、设置某个位(Set a Bit)

为了设置(即将某个位置1),我们使用**按位或(|)**运算符。

操作方法:

number = number | (1 << n);

n 是你想设置的位,1 << n 表示将 1 左移 n 位,构造一个位掩码,其中只有第 n 位为 1,其余为 0

使用按位或(|)运算符可以将指定的位设置为1,而不会影响其他位。

#include <stdio.h>

int main() {
    int number = 0;   // 初始化为0,二进制:0000
    int n = 2;        // 设置第2位(从右到左,0-indexed)
    
    number = number | (1 << n);  // 设置第2位为1
    
    printf("Number after setting bit %d: %d\n", n, number);  // 输出4,二进制:0100
    return 0;
}

2、 清除某个位(Clear a Bit)

为了清除某个位(即将某个位置0),我们使用**按位与(&)运算符和按位取反(~)**来创建掩码。

操作方法:

number = number & ~(1 << n);

~(1 << n) 构造一个掩码,其中第 n 位为0,其余位为 1。然后使用按位与(&)运算符清除第 n位,而不影响其他位。

#include <stdio.h>

int main() {
    int number = 7;   // 初始化为7,二进制:0111
    int n = 1;        // 清除第1位(0-indexed)
    
    number = number & ~(1 << n);  // 清除第1位
    
    printf("Number after clearing bit %d: %d\n", n, number);  // 输出5,二进制:0101
    return 0;
}

3、 切换某个位(Toggle a Bit)

为了切换某个位(即将 1 变为 0,或者将 0 变为 1),我们使用**按位异或(^)**运算符。

操作方法:

number = number ^ (1 << n);

1 << n 构造一个掩码,其中只有第 n 位为 1。按位异或可以切换该位的状态。

#include <stdio.h>

int main() {
    int number = 5;   // 初始化为5,二进制:0101
    int n = 2;        // 切换第2位(0-indexed)
    
    number = number ^ (1 << n);  // 切换第2位
    
    printf("Number after toggling bit %d: %d\n", n, number);  // 输出1,二进制:0001
    return 0;
}

4、检查某个位(Check a Bit)

为了检查某个位是否为 10,我们使用**按位与(&)**运算符。

操作方法:

bit = (number & (1 << n)) != 0;

1 << n 构造一个掩码,其中只有第 n 位为 1。按位与可以检测该位是否为 1

#include <stdio.h>

int main() {
    int number = 5;   // 初始化为5,二进制:0101
    int n = 2;        // 检查第2位
    
    int bit = (number & (1 << n)) != 0;  // 检查第2位是否为1
    
    printf("Bit %d is: %d\n", n, bit);   // 输出1,表示第2位为1
    return 0;
}

推荐文档