C++STL bitset介绍与使用方法

bitset

bitset主要是用于存储二进制位,在需要大量二进制计算的项目中,直接使用bitset比利用数组或者其它方式要更为方便,位运算在存储状态、模拟行动、搜索很多方面有非常巨大的优势

头文件:#include
构造函数
bitset<16> first;  //构造一个16位的bitset对象,初始值默认为0
bitset<16> second(177);  //构造一个16位的bitset对象,将177转换为二进制,拷贝到内存空间
bitset<16> secont_m(Oxff20);  //整型常量,可以直接十进制,也可以八进制,十六进制
bitset<16> third("1110011");  //将二进制字符串初始化到对象中
bitset<6> second_t(177);
bitset<6> third_t("1110011");

cout << first << endl;
cout << second << endl;
cout << third << endl;
cout << second_t << endl;
cout << third_t << endl;

for (int i = 0; i < 16; i++)
{
    cout << second[i];
}

//输出
/*
0000000000000000
0000000010110001
0000000001110011
110001
111001
1000110100000000
//由于bitset重载输出定向符号,为了便于查看,这里输出是逆向输出,长度为n的bitset,是按照n-1——>0的顺输出
*/
  • 需要注意以下几点
    • bitset与其它容器不一样,创建对象不需要提供容器变量类型,而是容器的大小,也即二进制位数
    • 如果bitset空间比二进制位数大,则在高位补0,(虽然上面输出是左边为0,但左边是高位,也即其索引分别是15~0)
    • 在将整形常量转换为二进制过后,如果bitset位数不够,则自动放弃原数值高位的二进制位。
    • 将二进制字符串常量转换为二进制过后,如果bitset位数不够,则自动放弃原二进制字符串低有效位(也即右边的位)[这一点与整型常量有点不一样]
    • 在将整数二进制存储到bitset中,整数的低位对应bitset的低位,也即bitset[0]存储的原整数的二进制最低有效位。
      bitset的低位为索引较小的位,也即数组下标0开始的位置。整数及字符串二进制低位为右边
位访问方式
  • 访问bitset的某一位
bitset<16> third("1110011");  //将二进制字符串初始化到对象中

cout << third[0] << endl;   //直接通过下标索引得到某一位的值
cout << third.count() << endl;  //统计bitset里面1的位数
cout << third.size() << endl;   //返回bitset总的位数
bool flag = third.test(i);      //测试第i为是否被置为1
flag = third.any();     //测试是否至少有1位被置为1(至少一个1,则返回true,否则返回false)
flag = third.none();    //测试是否没有一个被置为1(都是0,则返回true,否则false)
flag = third.all();   //(C++11)测试是否都是1(都是1,返回ture,否则返回false)
修改某一位
bitset<16> third("1110011");

third.set(i);      //将第i位置为1
third.set();       //将全部置为1
third.reset();     //将全部置为0
third.flip(i);     //将第i反转(取反)
third.flip();      //将bitset全部进行反转
整体转换
bitset<16> first("110010");

cout << first.to_string() << endl;   //以二进制字符串形式输出,将所有二进制位输出
cout <, first.to_ulong() << endl; //转换为unsigned long整数,然后输出
后记
  • 一直不知道STL里面还有这个容器,可以非常方便的实现二进制与十进制的转换,之前进制转换一直是自己来循环除或者累乘,以及通过与运算来进行位操作。下面是一段程序,利用bitset实现十进制到二进制的互相转换。
#include <iostream>
#include <bitset>
#include <string>

using namespace std;

int main()
{
    int decNum = 0;
    string binStr = "";
    string resStr = "";
    bitset<32> first;
    bitset<32> second;

    int a = true;
    cout << a << endl;


    cout << "Please input the decimal number: ";
    cin >> decNum;

    cout << "Please input the binary string: ";
    cin >> binStr;

    first = bitset<32>(decNum);
    second = bitset<32>(binStr);

    int pos = -1;
    for (int i = first.size()-1; i >= 0; i--)
    {
        if (first[i])
        {
            pos = i;
            break;
        }
    }
    for (int i = pos; i >= 0; i--)
    {
        //string tmp = (int)first[i] + "";
        //resStr += tmp;
        first[i] ? resStr += "1" : resStr += "0";
    }


    cout << "The binary string of the decimal number: " << resStr << endl;
    cout << "The decimal number of the binary string:" << second.to_ulong() << endl; 

    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值