#include <bitset>
#include <iostream>
using namespace std;
//using std::bitset
int main()
{
//1.bitset对象的定义和初始化
//bitset<n> b; //b 有 n 位,每位都 0
//bitset<n> b(u); //b 是 unsigned long 型 u 的一个副本
//bitset<n> b(s); //b 是 string 对象 s 中含有的位串的副本,如果不是位串,会抛出异常
//bitset<n> b(s, pos, n); //b 是 s 中从位置 pos 开始的&nbps;n 个位的副本
//bitset<32> bitvec; // 32 bits, all zero
//用unsigned值初始化bitset对象
//bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1
//bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0
//bitset<128> bitvec3(0xffff); // bits 32 through 127 initialized to zero
//用string对象初始化bitset对象
//当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。从 string 对象读入位集的顺序是从右向左(from right to left):
//bitvec4 的位模式中第 2 和 3 的位置为 1,其余位置都为 0。如果 string 对象的字符个数小于 bitset 类型的长度,则高阶位置为 0。
//string strval("1100");
//bitset<32> bitvet4(strval);
//string str("11110000");
//bitset<32> bitvec5(str, 3, 4); //starting at str[3] 1000
//bitset<32> bitvec6(str, str.size()-3); //如果省略第三个参数,意味着从开始位置一直到string末尾的所有字符, 本例为最后3个字符,即000
//2.bitset对象的操作
//b.any() b 中是否存在置为 1 的二进制位?
//b.none() b 中不存在置为 1 的二进制位吗?
//b.count() b 中置为 1 的二进制位的个数
//b.size() b 中二进制位的个数
//b[pos] 访问 b 中在 pos 处二进制位
//b.test(pos) b 中在 pos 处的二进制位置是否为1
//b.set() 把 b 中所有二进制位都置为 1
//b.set(pos) 把 b 中在 pos 处的二进制位置为 1
//b.any() b 中是否存在置为 1 的二进制位?
//b.reset() 把 b 中所有二进制位都置为 0
//b.reset(pos) 把 b 中在 pos 处的二进制位置为 0
//b.flip() 把 b 中所有二进制位逐位取反
//b.flip(pos) 把 b 中在 pos 处的二进制位取反
//b.to_ulong() 用 b 中同样的二进制位返回一个 unsigned long 值
//os << b 把 b 中的位集输出到 os 流
//测试整个bitset
//bitset<32> bitvec;
//bool is_set = bitvec.any();
//bool is_not_set = bitvec.none();
//size_t bits_set = bitvec.count();
//size_t size = bitvec.size(); //return 32
//访问bitset对象中的位
//for (int i=0; i != 32; i += 2)
//{
// bitvec[i] = 1;
//}
//for (int i=0; i != 32; i += 2)
//{
// bitvec.set(i);
//}
//for (int i = 0; i != 32; i++)
//{
// if (bitvec.test(i)) //or if(bitvec[i])
// {
// }
//}
//对整个bitset对象进行设置
//bitvec.reset(); //set all bits 0
//bitvec.set(); //set all bits 1
//bitvec.flip(0); //对 bitvec[0] 取反
//bitvec[0].flip(); //对 bitvec[0] 取反
//bitvec.flip(); //对所有bit位取反
//获取bitset对象的值
//to_ulong 操作返回一个 unsigned long 值,该值与 bitset 对象的位模式存储值相同。
//仅当 bitset 类型的长度小于或等于 unsigned long 的长度时,才可以使用 to_ulong 操作
//如果 bitset 对象包含的二进制位数超过 unsigned long 长度,将会产生运行时异常
//unsigned long ulong = bitvec.to_ulong();
//输出二进制位
//bitset<32> bitvec(0xffff);
//cout<<"bitvec = "<<bitvec<<endl; //bitvec = 00000000000000001111111111111111]
return 0;
}