最重要的一个问题:bitset的下标是从右边开始的!!!!很多人的博客都写错了,希望引起大家注意。
1.使用unsigned long值初始化bitset对象
若bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位将置为0;若bitset类型长度小于unsigned long值的二进制位数,则只使用unsigned 值中的低阶位,超过bitset类型长度的高阶位将被舍弃。
bitset<16> bitvec1(0xffff);// 0...15 set to 1 bitset<32> bitvec2(0xffff); // 0..15 set to 1;16...31 set to 0 bitset<128> bitvec3(0xffff); // 32...127 initialized to zero2.用string对象初始化bitset对象
3.bitset对象上的操作
以上一些操作的实际应用
#include <iostream>
#include <string>
#include <cstring>
#include <bitset>
using namespace std;
int main()
{
unsigned long m;
cin >> m;
bitset<16> b(m); //使用unsigned long初始化
cout << b << endl;
string str("10011");
bitset<16> sa(str); //使用string初始化 result:10011
cout << sa << endl;
bitset<32> bitve(0xffff);
cout << bitve << endl;
bitset<3> bs;
bool flag = bs.any(); //false,all bits are zero
bool is_ok = bs.none(); //true,all bits are zero
size_t sz = bs.size(); //return 3
for (int index = 0; index != 3; index++)
{
sa[index] = 1;
//sa.set(index); 等价
}
// set和reset对整个对象进行设置
sa.set(); // set all the bits to 1
sa.reset(); // set all the bits to 0
sa.flip(0);
sa[0].flip(); //与上面等价
sa.flip(); // reverses value of all bits
unsigned long res = sa.to_ulong();
cout << res << endl;
return 0;
}
<p>此外,我们来看一下和低级直接位操作的区别</p><p>设<span style="font-family:Times New Roman;">num</span><span style="font-family:宋体;">为</span><span style="font-family:Times New Roman;">unsigned long</span><span style="font-family:宋体;">数据类型</span></p>
sa.set(27);// equal to num |= 1UL<<27;(num =num | 1UL<<27)
sa.reset(27); // equal to num &= ~(1UL<<27)
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++ Primer 学习笔记与思考_5 bitset你用的正确吗?
原文地址:http://blog.csdn.net/nk_test/article/details/47679589