C++ 设置、清除和切换单个位

C++ 中,设置(Set)、清除(Clear)和切换(Toggle)一个 单独的位(bit) 通常使用 位运算符(bitwise operators) 来完成。在嵌入式编程和底层系统开发中,操作 “位” 是常见的需求。通过按位操作(bitwise operations),我们可以有效地设置、清除和切换(toggle)某一位。

1、设置第 n 位为 1

使用按位或运算符 (|) 将第 n 位设置为 1

#include <iostream>
#include <bitset>

int main() {
    unsigned int number = 0b00001010; // 初始值为二进制 00001010(十进制 10)
    int n = 3;  // 要设置第 3 位(从 0 开始计数)

    std::cout << "原始 number:      " << std::bitset<8>(number) << std::endl;

    number |= (1U << n);  // 设置第 n 位为 1

    std::cout << "设置第 " << n << " 位后: " << std::bitset<8>(number) << std::endl;
    std::cout << "十进制结果为:     " << number << std::endl;

    return 0;
}

2、清除第 n 位(设置为 0)

使用按位与运算符 (&) 和按位取反运算符 (~) 将第 n 位清除为 0

#include <iostream>
#include <bitset>

int main() {
    unsigned int number = 0b1111; // 初始值,所有8位都是1(255)
    int n = 3;  // 想要清除第3位(从0开始数)

    std::cout << "Before: " << std::bitset<8>(number) << std::endl;

    number &= ~(1U << n);  // 清除第 n 位

    std::cout << "After : " << std::bitset<8>(number) << std::endl;

    return 0;
}

3、切换第 n 位(0 变 1,1 变 0)

使用按位异或运算符 (^) 切换第 n 位的值。

#include <iostream>
#include <bitset>

int main() {
    unsigned int number = 0b00001010; // 二进制:00001010(十进制:10)
    int n = 1;

    std::cout << "原始值:\t\t" << std::bitset<8>(number) << std::endl;

    // 切换第 n 位(从0开始计数)
    number ^= (1U << n);

    std::cout << "切换第 " << n << " 位后:\t" << std::bitset<8>(number) << std::endl;

    // 再切换一次第 n 位,恢复原值
    number ^= (1U << n);
    std::cout << "再次切换第 " << n << " 位:\t" << std::bitset<8>(number) << std::endl;

    return 0;
}

4、检查第 n 位的值

要检查第 n 位是否为 1,可以使用按位与运算符 (&)。

#include <iostream>

int main() {
    unsigned int number = 42; // 二进制: 00101010
    int n = 3; // 检查第 3 位(从 0 开始,低位向高位)

    bool isSet = (number >> n) & 1U;

    std::cout << "第 " << n << " 位是 " << (isSet ? "1(已设置)" : "0(未设置)") << std::endl;

    return 0;
}

5、将第 n 位设置为特定值 x(0 或 1)

要将第 n 位设置为特定值 x,可以先清除该位,然后根据 x 的值设置。

#include <iostream>
#include <bitset>

void setBit(unsigned int& number, unsigned int n, unsigned int x) {
    number = (number & ~(1U << n)) | ((x & 1U) << n);
}

int main() {
    unsigned int number = 0b10101010;  // 初始值:170
    std::cout << "原始 number: " << std::bitset<8>(number) << std::endl;

    // 将第 3 位设置为 1
    setBit(number, 3, 1);
    std::cout << "设置第 3 位为 1: " << std::bitset<8>(number) << std::endl;

    // 将第 7 位设置为 0
    setBit(number, 7, 0);
    std::cout << "设置第 7 位为 0: " << std::bitset<8>(number) << std::endl;

    return 0;
}

推荐阅读
cjavapy编程之路首页