c++ - 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
?
解决方案
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
。
推荐阅读
- python - Python memoryView 和 mmap 正在重复读取和写入
- javascript - 将数组推入firebase中的子位置?
- python - Formset 无效但“保存”保存父模型并关闭页面
- file - 用汇编语言定义文件名
- orchardcms - 从 Orchard CMS 1.10.1 中的视图访问内容字段
- c# - “数据为 Null。无法对 Null 值调用此方法或属性。” 在日期时间
- c - C中有什么方法可以知道有多少进程具有相同的pgid?
- javascript - 在另一个单元格悬停时更改表格单元格中的 DIV 类
- javascript - 如何在 pug 中将“li”元素动态附加到其父“ul”
- python - 带有 Python 请求的持久会话以在登录后进行抓取