/*
*标准库bitset类型
*Zhi-Yun Deng
*2013-10-31
*/
#include <iostream>
#include <bitset> //标准库bitset类型头文件
#include <string>
#include <cstddef> //size_t类型定义在cstddef头文件中
using std::cin;
using std::cout;
using std::endl;
using std::bitset;//bitset的using声明
using std::string;
int main()
{
//初始化bitset对象
bitset<16> bitvec_01; //bitvec_01有16位,每位都为0
bitset<32> bitvec_02(0xf00f);//bitvec_02是0xf00f的一个副本
//bitvec_1 is smaller than the initializer
bitset<16> bitvec_1(0xffff); //bits 0...15 are set to 1
//bitvec_2 same size as initializer
bitset<32> bitvec_2(0xffff); //bits 0...15 are set to 1; 16...31 are 0
// on a 32-bit machine,bits 0 to 31 initialized from 0xffff
bitset<128> bitvec_3(0xffff); //bits 32 through 127 initialized to zero
string strval("1100");
bitset<32> bitvec_4(strval); //bitvec_4是string对象strval中含有的位串的副本
string str("1111111000000011001101");
bitset<32> bitvec_5(str, 5, 4); //4 bits starting at str[5], 1100
bitset<32> bitvec_6(str, str.size()-4); //use last 4 characters
//测试初始化后的值
cout << "*********0、初始化*********" << endl;
cout << "bitvec_01: " << bitvec_01 << endl;
cout << "bitvec_02: " << bitvec_02 << endl;
cout << "bitvec_1: " << bitvec_1 << endl;
cout << "bitvec_2: " << bitvec_2 << endl;
cout << "bitvec_3: " << bitvec_3 << endl;
cout << "bitvec_4: " << bitvec_4 << endl;
cout << "bitvec_5: " << bitvec_5 << endl;
cout << "bitvec_6: " << bitvec_6 << endl;
cout << "****************************\n" << endl;
//bitset对象上的操作
//1、测试整个bitset对象
bool is_set_1 = bitvec_01.any(); //false, all bits are zero
bool is_set_2 = bitvec_02.any(); //true, 0xf00f
bool is_not_set_1 = bitvec_01.none(); //true, all bits are zero
bool is_not_set_2 = bitvec_02.none(); //false, 0xf00f
size_t bits_set_1 = bitvec_01.count(); //returns number of bits that are on
size_t bits_set_2 = bitvec_02.count(); //returns number of bits that are on
size_t sz_1 = bitvec_01.size(); //returns 16
size_t sz_2 = bitvec_02.size(); //returns 32
cout << "****1、测试整个bitset对象****" << endl;
cout << "is_set_1: " << is_set_1 << endl; //0
cout << "is_set_2: " << is_set_2 << endl; //1
cout << "is_not_set_1: " << is_not_set_1 << endl; //1
cout << "is_not_set_2: " << is_not_set_2 << endl; //0
cout << "bits_set_1: " << bits_set_1 << endl; //0
cout << "bits_set_2: " << bits_set_2 << endl; //8
cout << "sz_1: " << sz_1 << endl; //16
cout << "sz_2: " << sz_2 << endl; //32
cout << "******************************\n" << endl;
//2、访问bitset对象中的位
cout << "***2、访问bitset对象中的位***" << endl;
cout << "bitvec_01: " << bitvec_01 << endl;
for(size_t index=0; index != bitvec_01.size(); ++index)
{//通过下标将二进制位都置为1
bitvec_01[index] = 1;
}
if(bitvec_01.test(0))
{//用test操作测试某个位是否为1
cout << "bitvec_01: " << bitvec_01 << endl;
}
bitvec_01.reset(); //重置为0
cout << "bitvec_01: " << bitvec_01 << endl;
for(size_t index=0; index!=bitvec_01.size(); ++index)
{//用set操作将二进制位置为1
bitvec_01.set(index);
}
if(bitvec_01[1])
{//测试下标操作符的返回值,测试某个位是否为1
cout << "bitvec_01: " << bitvec_01 << endl;
}
cout << "*****************************\n" << endl;
//3、对整个bitset对象进行设置
cout << "***3、对整个bitset对象进行设置***" << endl;
cout << "bitvec_01: " << bitvec_01 << endl;
bitvec_01.reset(); //set all the bits to 0
cout << "bitvec_01: " << bitvec_01 << endl;
bitvec_01.set(); //set all the bits to 1
cout << "bitvec_01: " << bitvec_01 << endl;
bitvec_01.flip(0); //reverses value of first bit
cout << "bitvec_01: " << bitvec_01 << endl;
bitvec_01[0].flip(); //also reverses the first bit
cout << "bitvec_01: " << bitvec_01 << endl;
bitvec_01.flip(); //reverses value of all bits
cout << "bitvec_01: " << bitvec_01 << endl;
cout << "*********************************\n" << endl;
//4、获取bitset对象的值
cout << "*****4、获取bitset对象的值*****" << endl;
unsigned long ulong = bitvec_01.to_ulong(); //returns 0
cout << "ulong: " << ulong <<endl;
ulong = bitvec_01.set().to_ulong(); //returns 65535 (bitvec_01 is a 16-bits bitset object.)
cout << "ulong: " << ulong <<endl;
cout << "********************************\n" << endl;
return 0;
}
【C++ Primer】标准库bitset类型
最新推荐文章于 2021-06-04 15:36:25 发布