《C++ Primer》第17章 17.2节习题答案

《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;
}

运行结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值