位图bitset与位运算
文章目录
前言
本文将探讨C++中的位操作,可以用来进行高效的数据处理和存储。通过介绍bitset
和two_bitset
类模板,我们将展示如何利用C++的位操作来解决实际问题,从而提高代码的性能和可读性。
一、基本的位运算
在C++中,位运算是对整数类型数据在位级别上进行操作的运算符。这些运算符包括:
- 位与(AND)运算符 :&
当两个操作数对应的位都为1时,结果位为1,否则为0。
// 位与(AND)运算符 &
int a = 5; // 二进制表示: 0101
int b = 9; // 二进制表示: 1001
int c = a & b; // 结果为 1 (0001)
- 位或(OR)运算符 :|
当两个操作数对应的位中至少有一个为1时,结果位为1,否则为0。
// 位或(OR)运算符 |
c = a | b; // 结果为 13 (1101)
- 位异或(XOR)运算符:^
当两个操作数对应的位只有一个为1时,结果位为1,如果两个都为0或都为1,则结果位为0。
// 位异或(XOR)运算符 ^
c = a ^ b; // 结果为 12 (1100)
- 位非(NOT)运算:~
对操作数的每一位进行取反操作,即1变0,0变1。
// 位非(NOT)运算符 ~
c = ~a; // 结果为 -6 (取决于系统的整数表示方法)
- 左移(Left Shift)运算符:<<
将操作数的所有位向左移动指定的位数,右边空出的位用0填充。
// 左移(Left Shift)运算符 <<
c = a << 1; // 结果为 10 (1010)
- 右移(Right Shift)运算符:>>
将操作数的所有位向右移动指定的位数,左边空出的位用0或符号位填充(取决于数据类型)。
// 右移(Right Shift)运算符 >>
c = a >> 1; // 结果为 2 (0010)
二、位图 (bitset)
bitset 类模板框架
template<size_t N>
class bitset
{
typedef bitset<N> Self;
public:
bitset();
public:
Self& set(size_t pos); // 将pos值所在比特位设为1
Self& reset(size_t pos); // 将pos值所在比特位清零
bool test(size_t pos); // 判断pos值是否在bitset中
private:
std::vector<int> _bits;
};
私有成员变量 _bits
_bits
是一个整数向量,用于存储位集合的实际位值。
private:
std::vector<int> _bits;
构造函数
bitset()
{
_bits.resize(N/32