17.2 The bitset Type(bitset类型)

包含在bitset头文件中

 

bitset类是-一个类模板,它类似array类,具有固定的大小。

 

包含编号从0到31的32个二进制位。编号从0开始的二进制位被称为低位,编号到31结束的二进制位被称为高位。

 

#include <iostream>
#include <bitset>
#include <string>

using namespace std;

int main()
{
    bitset<13> b(666);//总共13位二进制表示666
    cout << b << endl;

    system("PAUSE");
    return 0;
}

 

当我们使用一个整型值来初始化bitset时,此值将被转换为unsigned long long类型并被当作位模式来处理。bitset中的二进制位将是此模式的一个副本。如果bitset的大小大于一个unsigned long long中的二进制位数,则剩余的高位被置为0。如果bitset的大小小于一个unsigned long long中的二进制位数,则只使用给定值中的低位,超出bitset大小的高位被丢弃:

 

当我们使用字符串表示数时,字符串中下标最小的字符对应高位,反之亦然。

#include <iostream>
#include <bitset>
#include <string>

using namespace std;

int main()
{
    bitset<13> b("110111");
    cout << b << endl;

    system("PAUSE");
    return 0;
}

 

bitset操作

 

 to ulong和to ullong操作都返回一个值,保存了与bitset对象相同的位模式。

 

如果bitset中的值不能放入给定类型中,则这两个操作会抛出一个overflow_error异常。

 

运用

#include <iostream>
#include <bitset>

using namespace std;

template <size_t N> class exam {
public:
    exam():b(){}
    size_t get_num() { return N; }
    void set_solution(size_t n, bool a) { b.set(n, a); }
    bitset<N> get_solution() { return b; }
    size_t get_score(bitset<N>& c);
private:
    bitset<N> b;
};

template <size_t N>
size_t exam<N>::get_score(bitset<N>& c) {
    size_t ret = 0;
    for (int i = 0; i < N; ++i) {
        if (b[i] != c[i])
            ret++;
    }

    return ret;
}

int main()
{
    exam<50> s;
    bitset<50> f;
    s.set_solution(1, 1);
    s.set_solution(45, 1);
    cout << s.get_solution() << endl;

    cout << s.get_num() << "道题,对了" << s.get_score(f) << "" << endl;

    system("PAUSE");
    return 0;
}
posted @ 2019-02-27 15:23  Hk_Mayfly  阅读(161)  评论(0)    收藏  举报