介绍
bitset类是一个类模板,定义的时候需要指出固定长度,每一个元素为一个二进制位,类似bool数组,使用上有点类似bitmap(位图)的用法。
定义和初始化bitset
定义一个bitset的时候,必须指出它包含多少个二进制位:
bitset<32> bitvec(1u); //32位的bitset,低位为1,其他为0
bitset的大小必须是常量表达式;编号从0开始的是低位,31为高位。
bitset的构造函数:
bitset b; //声明一个n为的bitset
bitset b(u); //b是unsigned long long值u的低n位的拷贝
bitset b(str, pos, m, zero, one); //b是string str从位置pos开始的m个字符的拷贝,只能包含0和1,有其他字符就会抛出异常
bitset b(cp, pos, m, zero, one); //与string那个类似,只是cp是指向字符数组的指针
上述的构造函数中,如果u或者str超出了n的长度,那就抛弃超出的高位;如果n比较大,那就高位置0。
用unsigned 值初始化bitset
bitset<13> bitvec1(0xbeef);
bitset<20> bitvec2(0xbeef);
bitset<128> bitvec3(~0ull); //在64位机子中,long long 0ull是64个bit,因此~0ull是64个1,所以这个bitset是0~63位为1,64~127位为0
用string来初始化bitset
bitset<32> bitvec4("1100"); //2,3位为1,1,0位为0,其余高位为0;注意这里的初始化时候是左边是高位,右边是低位
string str("1111111111100101010100101101001100");
bitset<32> bitvec5(str, 5, 4); //从str[5]开始的四个二进制位初始化bitvec5
bitset<32> bitvec6(str, str.size() - 4); //使用从str.size() - 4开始到0的4个字符
bitset的操作
关于bitset的操作主要是置位和复位的操作。
bitvec1.all(); //是否所有位都为1
bitvec1.any(); //是否存在为1的二进制位
bitvec1.count(); //为1的位数
bitvec1.none(); //是否全是0
bitvec1.size(); //返回bitset的位数
bitvec1.test(pos); //若pos位是1,返回true,否则返回false
bitvec1.set(pos, v); //将pos位设置为bool值v
bitvec1.set(); //将所有位置为1
bitvec1.reset(pos); //将pos处置为0
bitvec1.reset(); //将所有位置0
bitvec1.flip(pos); //将pos位的状态反转
bitvec1.flip(); //将所有位反转
bitvec1[pos]; //访问pos处的位
bitvec1.to_ulong(); //返回一个unsigned long值
bitvec1.to_ullong(); //返回一个unsigned long long 值
bitvec1.to_string(); //返回一个string
各种c bitset函数如下:
功能 |
all() |
any() |
count() |
flip() |
none() |
operator[] |
reset() |
set() |
size() |
test() |
to_string() |
to_ullong() |
to_ulong()() |