《C++ Primer》笔记处理0,1字符操作标准库 bitset

原来C++中还有专门处理0,1操作的库类 bitset(从字面上解释,比特集合,集合貌似不贴切。)
1.
bitset 是处理二进制位的有序集 ,每个位读只能是0或1.
#include <bitset>
using std::bitset;
2.
bitset 对象的定义和初始化 
bitset<32> bitvec; // 32 bits, all zero
在 32 位 unsigned long 的机器上,十六进制值 0xffff 表示为二进制位 就是十六个 1 和十六个 0(每个 0xf 可表示为 1111)。可以用 0xffff 初始 化 bitset 对象 

// bitvec1 is smaller than the initializer
bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1

// bitvec2 same size as initializer
bitset<32> bitvec2(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> bitvec3(0xffff); // bits 32 through 127 initialized to zero

string 对象初始化 bitset 对象

当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。

从 string 对象读入位集的顺序是从右向左(from right to left):

     string strval("1100");
     bitset<32> bitvec4(strval);

bitvec4 的位模式中第 2 和 3 的位置为 1,其余位置都为 0。如果 string 对 象的字符个数小于 bitset 类型的长度,则高阶位置为 0。 

当用 string 对象初始
化 bitset 对象时,记住这一差别很重要。 

不一定要把整个 string 对象都作为 bitset 对象的初始值。相反,可以只 用某个子串作为初始值:

string str("1111111000000011001101");
bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100

bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters 

3.7. bitset 操作

b.any()

page146image9992

b 中是否存在置为 1 的二进制位?

page146image11736 page146image12160

b.none()

b 中不存在置为 1 的二进制位吗?

page146image15624 page146image16216 page146image16536 page146image16960 page146image17384

b.count()

b 中置为 1 的二进制位的个数

page146image21136 page146image21728 page146image22048 page146image22472 page146image22896

b.size()

b 中二进制位的个数

page146image26568 page146image27160 page146image27480 page146image27904 page146image28328

b[pos]

访问 b 中在 pos 处二进制位

page146image32120 page146image32712 page146image33032 page146image33456 page146image33880

b.test(pos)

b 中在 pos 处的二进制位置为 1 么?

page146image37752 page146image38344 page146image38664 page146image39088 page146image39512

b.set()

page146image40760 page146image41352 page146image41512 page146image41936 page146image42360

把 b 中所有二进制位都置为 1

page146image46000

b.set(pos)

page146image48040

把 b 中在 pos 处的二进制位置为 1

page147image1080

3.7. bitset 操作

b.any()

page147image6776

b 中是否存在置为 1 的二进制位?

page147image8520 page147image8944

b.reset()

把 b 中所有二进制位都置为 0

b.reset(pos)
page147image15560 page147image15984

把 b 中在 pos 处的二进制位置为 0

b.flip()

page147image21152 page147image21576

把 b 中所有二进制位逐位取反

b.flip(pos)

page147image26624 page147image27048

把 b 中在 pos 处的二进制位取反

b.to_ulong()
page147image33992 page147image34416

用 b 中同样的二进制位返回一个 unsigned long 值

page147image36240 page147image36664

os << b

page147image40144

把 b 中的位集输出到 os 流


原文地址:https://www.cnblogs.com/worldtraveler/p/2836113.html