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;
}