C++ 入门第 5 版:表示整数序列的位集

C++ primer 5th edition: A bitset to represent a sequence of integers

有人问我 C++ primer 第 5 版这个练习:

Exercise 17.10: Using the sequence 1, 2, 3, 5, 8, 13, 21, initialize a bitset that has a 1 bit in each position corresponding to a number in this sequence. Default initialize another bitset and write a small program to turn on each of the appropriate bits.

其实我几乎把书上所有的习题都做完了,但是我就是看不懂这个。我明白了 std::bitset

我找到了这样的解决方案:

// init from the sequence: 1, 2, 3, 5, 8, 13, 21
std::bitset<22> bitseq("1000000010000100101110");
std::cout << bitseq << std::endl;

// Default initialize, then turn on.
std::bitset<22> bit_default;
for (auto i : {1, 2, 3, 5, 8, 13, 21})
    bit_default.set(i);
std::cout << bit_default << std::endl;

assert(bitseq == bit_default);

但我不知道这是怎么回事,它是如何工作的?如果正确,请帮助我理解这一点。非常感谢你们!

我不明白这样的1000000010000100101110怎么能代表序列1, 2, 3, 5, 8, 13, 21

How can 1000000010000100101110 represent the sequence 1, 2, 3, 5, 8, 13, 21?

基数 2 中的数字通常 写入 MSB 在前 - 最高有效位在前 - 通常 编号 索引从右到左,从最低位开始,从0(或1)开始。

1000000010000100101110
^       ^            ^-- bit with index 0  - least significant bit 2^0
^       ^           ^--- bit with index 1
^       ^          ^---- bit with index 2
^       ^         ^----- bit with index 3
^       ^        ^------ bit with index 4
^       ^       ^------- bit with index 5
^       ^      ^-------- bit with index 6
^       ^     ^--------- bit with index 7
^       ^--------------- bit with index 13
^----------------------- bit with index 21 - most significant bit 2^21

当从右侧从 0 开始对位位置进行编号时,序列 1, 2, 3, 5, 8, 13, 21 表示字符串 1000000010000100101110.

中的集合位