C++ Primer 学习笔记与思考_5 bitset你用的正确吗?

bitset类型比整型值上的低级位操作更容易使用,简化了位集的处理。在定义bitset时,要明确bitset含有的位数,在尖括号内给出它的长度值。
注意位集合的编号从0开始,低位存低阶位。

最重要的一个问题: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 zero
2.用string对象初始化bitset对象
      string对象和bitset对象之间的转换是反向的,string对象的最右边字符用来初始化bitset对象的低阶位。其实这一点不用特别记忆,因为假如定义的对象是bitset<4> b(“1101”);那么输出b也是1101,之所以上面那么说是因为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)

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值