C++语言基础 —— STL —— 容器与迭代器 —— bitset

【概述】

bitset 位于 <bitset> 头文件中,其是 STL 的一部分,准确地说,bitset 是一个模板类而不是容器,其模板参数不是类型,而整型的数值,即:bitset <N> 

bitset 存储的是二进制位,与一个 bool 型的数组相似,其每位只占一个字节,极大的优化了空间,使用 bitset 可以像使用数组一样利用位。

【定义】

bitset 的定义为在定义时必须定义其大小,定义一个空 bitset 时所有值默认为 0

bitset<8> bit1;
bitset<8> bit2(8);
bitset<8> bit3(string("01010101"));
bitset<8> bit4(bit2);

cout<<"bit1="<<bit1<<endl;//bit1=00000000
cout<<"bit2="<<bit2<<endl;//bit2=00001000
cout<<"bit3="<<bit3<<endl;//bit3=01010101
cout<<"bit4="<<bit4<<endl;//bit4=00001000

【运算】

bitset 可以直接做位运算

bitset<4> bit1(string("0101"));
bitset<4> bit2(string("1110"));

cout<<"(bit1&bit2)="<<(bit1&bit2)<<endl;//(bit1&bit2)=0100
cout<<"(bit1|bit2)="<<(bit1|bit2)<<endl;//(bit1|bit2)=1111
cout<<"(bit1^bit2)="<<(bit1^bit2)<<endl;//(bit1^bit2)=1011
cout<<"(~bit1)="<<(~bit1)<<endl;//(~bit1)=1010

cout<<"(bit1&=bit2)="<<(bit1&=bit2)<<endl;//(bit1&=bit2)=0100
cout<<"(bit1|=bit2)="<<(bit1|=bit2)<<endl;//(bit1|=bit2)=1110
cout<<"(bit1^=bit2)="<<(bit1^=bit2)<<endl;//(bit1^=bit2)=0000
cout<<"(bit1<<=1)="<<(bit1<<=1)<<endl;//(bit1<<=1)=0000
cout<<"(bit1^=4)="<<(bit1^=4)<<endl;//(bit1^=4)=0100

cout<<"(bit1==bit2)="<<(bit1==bit2)<<endl;//(bit1==bit2)=0
cout<<"(bit1!=bit2)="<<(bit1!=bit2)<<endl;//(bit1!=bit2)=1

【循环移位操作】

由于 bitset 没有循环移位,所以可将循环移位进行拆解,有:

  • 左移 k 位时:先左移 k 位,再右移 m-k 位,最后两者取或,即:(x<<k)|(x>>(m-k))
  • 右移 k 位时:先右移 k 位,再左移 m-k 位,最后两者取或,即:(x>>k)|(x<<(m-k))
bitset<N> left(bitset<N> &x,int val,int len) {//val为移动位数,len为bitset长度
    return (x<<val)|(x>>(len-val));
}
bitset<N> right(bitset<N> &x,int val,int len) {val为移动位数,len为bitset长度
    return (x>>val)|(x<<(len-val));
}

【函数】

bitset 没有迭代器,但其函数十分便捷

  • bit.size();//返回长度
  • bit.count();//返回1的个数
  • bit.any();//返回是否有1
  • bit.none();//返回是否没有1
  • bit.set();//全部置为1
  • bit.set(p);//下标从0开始,将p+1的位置为1
  • bit.set(p,n);//将p+1位置为n
  • bit.reset();//全部置为0
  • bit.reset(p);//将p+1位置为0
  • bit.flip();//全部取反等同于(~bit)
  • bit.flip(p);//将p+1位取反
  • bit.to_ulong();//返回转换为unsignedlong的结果,超范围会报错
  • bit.to_ullong();//返回转换为unsignedlonglong的结果,超范围报错
  • bit.to_string();//返回转换为string的结果
posted @   老程序员111  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示