📜  C++位集有趣的事实(1)

📅  最后修改于: 2023-12-03 14:59:51.740000             🧑  作者: Mango

C++位集有趣的事实

C++提供了一个称为std::bitset的标准库容器,可以将数据存储为位序列,并允许快速的位运算,这在某些情况下非常有用。

1. 构造一个位集

要构造一个位集,你必须指定其长度。以下代码创建一个长度为10的位集:

std::bitset<10> bitset1;

如果我们想初始化一个已知值的位集,可以使用字符串表示形式,该字符串由0和1构成,其中第一个字符表示最高有效位。以下代码将位集初始化为1010101010:

std::bitset<10> bitset2("1010101010");
2. 使用位运算

位运算允许我们以位为单位执行AND、OR、XOR和NOT运算。以下是一些示例:

std::bitset<4> bits1("1100");
std::bitset<4> bits2("0110");

bits1 &= bits2; // AND,bits1 = 0100
bits1 |= bits2; // OR,bits1 = 0110
bits1 ^= bits2; // XOR,bits1 = 0010
bits1 = ~bits2; // NOT,bits1 = 1001

位运算是CPU可以执行的最快的操作之一,因此在某些情况下,使用位运算比使用常规算术运算符要快得多。

3. 访问单个位

要访问单个位,我们可以使用operator[](类似于数组索引运算符)或test()成员函数。以下代码演示了如何访问位集的第3个位:

std::bitset<4> bits("0101");

bool thirdBit = bits[2]; // 1
bool thirdBit2 = bits.test(2); // 1
4. 计算二进制表示中1的个数

要计算一个位集中二进制表示中1的个数,可以使用count()成员函数。以下代码演示了如何计算一个位集中1的个数:

std::bitset<8> bits("00101011");
int count = bits.count(); // 4
5. 将位集转换为整数类型

我们可以将位集转换为各种整数类型,包括unsigned longunsigned long long。以下是一些示例:

std::bitset<8> bits("00101011");

unsigned long ulongval = bits.to_ulong(); // 43
unsigned long long ullongval = bits.to_ullong(); // 43

请注意,在将位集转换为整数类型时,位数量必须小于等于整数类型的位数,否则会导致未定义行为。

6. 位集的大小

位集的大小(即所存储的位数)可以在编译时确定,并且不能动态更改。以下代码演示了如何获取位集的大小:

std::bitset<5> bits1;
int size1 = bits1.size(); // 5

std::bitset<8> bits2("10011001");
int size2 = bits2.size(); // 8
7. 位集可以用于压缩数据

在某些情况下,位集可以用于压缩数据。例如,我们可以用一个长度为8的位集来存储代表字母表中的字符的布尔值。这将比使用8个单独的布尔变量更节省空间。