《C++ Primer》第17章 标准库特殊设施
17.2节 BITSET类型 习题答案
练习17.9:解释下列每个bitset对象所包含的位模式:
(a)bitset<64> bitvec(32);
(b)bitset<32> bv(1010101);
(c)string bstr; cin >> bstr; bitset<8>bv(bstr);
【出题思路】
熟悉bitset的定义。
【解答】
(a)bitvec为32位,第5位为1,剩余位为0。
(b)bv为32位,0、2、4、6这4位为1,剩余位为0。
(c)bv为8位,用bstr来对其进行初始化。若读入的字符串不是单纯的二进制字符串,程序会抛出invalid_argument异常。
练习17.10:使用序列1、2、3、5、8、13、21初始化一个bitset,将这些位置位。对另一个bitset进行默认初始化,并编写一小段程序将其恰当的位置位。
【出题思路】
练习bitset操作。
【解答】
构造一个无符号整数,将1、2、3、5、8、13、21这7位置位,然后用其初始化bitset。对于第二小问,用set成员函数对默认初始化的bitset置位即可。
#include#include using namespace std; int main() { unsigned bp = 2 | (11 << 2) | (1 << 5) | (1 << 8) | (1 << 13) | (1 << 21); bitset<32> bv(bp); bitset<32> bv1; bv1.set(1); bv1.set(2); bv1.set(3); bv1.set(5); bv1.set(8); bv1.set(13); bv1.set(21); cout << bv1 << endl; return 0; }
输出结果:
00000000001000000010000100101110
练习17.11:定义一个数据结构,包含一个整型对象,记录一个包含10个问题的真/假测验的解答。如果测验包含100道题,你需要对数据结构做出什么改变(如果需要的话)?
【出题思路】
本题练习bitset的定义和使用。
【解答】
如果使用整数保存测验解答,那么对于10个问题的测验,只需一个短整型对象即可。如果改为100道题,则需4个32位整数或是2个64位整数。而且修改的并不仅仅是数据结构,所有对整型数进行操作来修改解答和评分的代码都要相应进行修改,工作量很大。
采用bitset则有很明显的优势,当题目数改变时,我们只需改变bitset的规模,而操作bitset来完成改答案、评分的代码则只需进行很小的修改。
最佳的方式是定义一个类模板,它有一个模板参数表示题目数,有一个bitset成员保存解答,然后定义一些成员函数来完成改答案、评分等操作。当题目数发生变化,我们只需实例化一个新版本即可,其他代码均无须改动。
练习17.12:使用前一题中的数据结构,编写一个函数,它接受一个问题编号和一个表示真/假解答的值,函数根据这两个参数更新测验的解答。
【出题思路】
本题练习bitset的定义和使用。
【解答】
此函数直接调用bitset的set操作即可,程序见下题。
练习17.13:编写一个整型对象,包含真/假测验的正确答案。使用它来为前两题中的数据结构生成测验成绩。
【出题思路】
本题练习bitset的定义和使用。
【解答】
使用一个循环,比较两个bitset的相同位的数目,即可得到测验成绩。
#include#include using namespace std; template class exam { public: exam() : s() { } size_t get_size() { return N; } void set_solution(size_t n, bool b) { s.set(n, b); } bitset get_solution() const { return s; } size_t score(const bitset &a); private: bitset s; }; template size_t exam ::score(const bitset &a) { size_t ret = 0; for(size_t i = 0; i < N; ++i) if(s[i] == a[i]) ret++; return ret; } int main() { exam<80> e; e.set_solution(0, 1); e.set_solution(79, 1); cout << e.get_solution() << endl; bitset<80> a; cout << e.get_size() << "题对了" << e.score(a) << "题" << endl; return 0; }
运行结果:



