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

问题描述

我在 C++ 入门第 5 版中被问到这个练习:

练习 17.10:使用序列 1、2、3、5、8、13、21,初始化一个 bitset,该 1 的每个位置都有一个 bitset 位对应此中的一个数字 顺序。认初始化另一个 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,21}) bit_default.set(i); std::cout << bit_default << std::endl; assert(bitseq == bit_default);

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

1000000010000100101110

但是我不知道它是怎么来的以及它是如何工作的?如果正确,请帮助我理解这一点。太感谢大家了!

我不明白这样的 1,21 如何表示序列 a?。

解决方法

1000000010000100101110如何表示序列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 中的设置位。