c++位运算

C中的位运算符用于对二进制数进行操作。以下是C中的位运算符:

按位与(&):两个操作数的每一位都为1时,结果为1,否则为0。

按位或(|):两个操作数的每一位都为0时,结果为0,否则为1。

按位异或(^):两个操作数的每一位相同时,结果为0,否则为1。

按位取反(~):对操作数的每一位取反。

左移(<<):将操作数的二进制数向左移动指定的位数,右侧用0填充。

右移(>>):将操作数的二进制数向右移动指定的位数,左侧用符号位填充。

以下是一些位运算的示例:

int a = 5; // 二进制表示为 0101
int b = 3; // 二进制表示为 0011

int c = a & b; // c的值为 1,二进制表示为 0001
int d = a | b; // d的值为 7,二进制表示为 0111
int e = a ^ b; // e的值为 6,二进制表示为 0110
int f = ~a; // f的值为 -6,二进制表示为 1111 1011
int g = a << 2; // g的值为 20,二进制表示为 10100
int h = b >> 1; // h的值为 1,二进制表示为 0001

注意,位运算符只能用于整数类型,包括char、short、int、long和long long。

除了上面提到的位运算符,C++还提供了一些其他的位运算符,如下所示:

&=:按位与赋值运算符,相当于a = a & b。

|=:按位或赋值运算符,相当于a = a | b。

^=:按位异或赋值运算符,相当于a = a ^ b。

<<=:左移赋值运算符,相当于a = a << b。

=:右移赋值运算符,相当于a = a >> b。

这些位运算符可以用于对变量进行位运算操作,并将结果赋值给变量。例如:

int a = 5; // 二进制表示为 0101
int b = 3; // 二进制表示为 0011

a &= b; // a的值为 1,二进制表示为 0001
b |= a; // b的值为 3,二进制表示为 0011
a ^= b; // a的值为 2,二进制表示为 0010
b <<= 2; // b的值为 12,二进制表示为 1100
a >>= 1; // a的值为 1,二进制表示为 0001

除了基本的位运算符和赋值运算符,C++还提供了一些其他的位运算函数,如下所示:

bitset:用于创建一个二进制位集合,并对其进行位运算操作。

bitset::count:用于计算一个二进制位集合中1的个数。

bitset::to_ulong:用于将一个二进制位集合转换为unsigned long类型。

这些函数可以用于更高级的位运算操作,例如:

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> a("01010101");
    std::bitset<8> b("00110011");

    std::bitset<8> c = a & b;
    std::cout << c << std::endl; // 输出 00010001

    int count = c.count();
    std::cout << count << std::endl; // 输出 2

    unsigned long d = c.to_ulong();
    std::cout << d << std::endl; // 输出 17

    return 0;
}

这个示例中,我们使用了std::bitset类来创建一个二进制位集合,并对其进行按位与运算、计算1的个数和转换为unsigned long类型。