首页 > 解决方案 > C++ 入门第 5 版:表示整数序列的位集

问题描述

我在 C++ Primer 5th edition 这个练习中被问到:

练习 17.10:使用序列 1, 2, 3, 5, 8, 13, 21,初始化在每个位置bitset都有一个1位对应于该序列中的数字的 a。默认初始化另一个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, 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

标签: c++std-bitset

解决方案


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


推荐阅读