菜鸟笔记
提升您的技术认知

C++ bitset

阅读 : 1308

介绍

bitset类是一个类模板,定义的时候需要指出固定长度,每一个元素为一个二进制位,类似bool数组,使用上有点类似bitmap(位图)的用法。

定义和初始化bitset

定义一个bitset的时候,必须指出它包含多少个二进制位:
bitset<32> bitvec(1U); //32位的bitset,低位为1,其他为0
bitset的大小必须是常量表达式;编号从0开始的是低位,31为高位。

bitset的构造函数

bitset<n> b;  //声明一个n为的bitset
bitset<n> b(u);  //b是unsigned long long值u的低n位的拷贝
bitset<n> b(str, pos, m, zero, one);  //b是string str从位置pos开始的m个字符的拷贝,只能包含0和1,有其他字符就会抛出异常
bitset<n> 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()()