问题描述
我在 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
中的设置位。