《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 <iostream>
#include <bitset>
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 <iostream>
#include <bitset>
using namespace std;
template <size_t N>
class exam {
public:
exam() : s() { }
size_t get_size() { return N; }
void set_solution(size_t n, bool b)
{ s.set(n, b); }
bitset<N> get_solution() const
{ return s; }
size_t score(const bitset<N> &a);
private:
bitset<N> s;
};
template <size_t N>
size_t exam<N>::score(const bitset<N> &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;
}
运行结果: