bitset位集学习

 类模板bitset表示一个N位的固定大小的二进制位序列。可以用标准逻辑运算符操作bitset,并将它与字符串和整数相互转换。本篇介绍bitset的一些基本使用方法。

1.bitset的初始化:

#include <bitset>

using namespace std;

int main()
{
    //初始化
    bitset<8> b0;
    bitset<8> b1{0b00101010};//42的二进制字面量
    bitset<8> b2{55};
    bitset<8> b3{'A'};
    bitset<8> b4{0xA};
    bitset<8> b5{0xAA};
    cout << "b0 = " << b0 << "\nb1 = " << b1 << "\nb2 = " << b2 << "\nb3 = " << b3 << "\nb4 = " << b4
         << "\nb5 = " << b5 << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

 上面显示的初始化数据值都在固定的位数,那么如果我们定义的是8位初始化一个超过8位的数据会取哪一个值呢,比哪biset<8> b6{0XAABB},这个会是什么值呢

#include <bitset>

using namespace std;

int main()
{
    //初始化
    bitset<8> b0;
    bitset<8> b1{0b00101010};//42的二进制字面量
    bitset<8> b2{55};
    bitset<8> b3{'A'};
    bitset<8> b4{0xA};
    bitset<8> b5{0xAA};
    cout << "b0 = " << b0 << "\nb1 = " << b1 << "\nb2 = " << b2 << "\nb3 = " << b3 << "\nb4 = " << b4
         << "\nb5 = " << b5 << endl;
    bitset<8> b6{0xAABB};
    cout << "b6 = " << b6 << endl;

    cout << "Hello World!" << endl;
    return 0;
}

 从结果来看b6显示的10111011,取的是后8位的值。

2.元素访问

operator[]

访问指定的位
(公开成员函数)

test

访问特定位
(公开成员函数)

all
any
none

(C++11)  

检查是否所有、任一或无位被设为 true
(公开成员函数)

count

返回设置为 true 的位的数量
(公开成员函数)
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    //元素访问
    //operator[]访问指定的位
    std::bitset<8> b1{0b00101010}; // 42 的二进制字面量
    std::cout << "b1初始化后,b1 持有 " << b1 << endl;
    for (std::size_t i = 0; i < b1.size(); ++i)
    {
        std::cout << "b1[" << i << "]:" << b1[i] << '\n';
    }
    b1[0] = true; // 通过 bitset::reference 修改第一个位
    std::cout << "设置位 0 后,b1 持有 " << b1 << endl;

    //test  访问特定位
    std::bitset<10> b2("1111010000");
    std::size_t idx = 0;
    while (idx < b2.size() && !b2.test(idx)) {
        ++idx;
    }

    if (idx < b2.size()) {
        std::cout << "first set bit at index " << idx << endl;
    } else {
        std::cout << "no set bits" << endl;
    }

    //all  any   none  检查是否所有、任一或无位被设为 true
    std::bitset<4> b3("0000");
    std::bitset<4> b4("0101");
    std::bitset<4> b5("1111");

    std::cout << "bitset\t" << "all\t" << "any\t" << "none\n";
    std::cout << b3 << '\t' << b3.all() << '\t' << b3.any() << '\t' << b3.none() << '\n';
    std::cout << b4 << '\t' << b4.all() << '\t' << b4.any() << '\t' << b4.none() << '\n';
    std::cout << b5 << '\t' << b5.all() << '\t' << b5.any() << '\t' << b5.none() << '\n';

    //count 返回设置为 true 的位的数量
    std::bitset<8> b6("00010010");
    std::cout << "initial value: " << b6 << '\n';

    // 寻找首个未设置的位
    std::size_t idx6 = 0;
    while (idx6 < b6.size() && b6.test(idx6))
    {
        std::cout << "b6.test(" << idx6 << ")= " << b6.test(idx6) << '\n';
        ++idx6;
    }
    std::cout << "idx6===== " << idx6 << ": " << b6 << '\n';
    // 继续设置位直至 bitset 有一半被填充
    while (idx < b6.size() && b6.count() < b6.size()/2)
    {
        b6.set(idx6);// 从右往左设置
        std::cout << "setting bit " << idx6 << ": " << b6 << '\n';
        while (idx6 < b6.size() && b6.test(idx6)) ++idx6;
    }

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

 

3.容量size();

#include <iostream>
#include <bitset>
#include "bitsetdemo.h"

using namespace std;

int main()
{
    cout << bitset<0X400>().size() << endl;
    bitset<10> b1;
    bitset<'A'> b2;
    cout << "b1.size()=======" << b1.size() << endl;
    cout << "b2.size()=======" << b2.size() << endl;
    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

 4.修复器

operator&=
operator|=
operator^=
operator~

进行二进制与、或、异或及非
(公开成员函数)

operator<<=
operator>>=
operator<<
operator>>

进行二进制左移和右移
(公开成员函数)

set

将位置为 true 或者提供的值
(公开成员函数)

reset

将位置为 false
(公开成员函数)

flip

翻转位的值
(公开成员函数)
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    //修改器
    //operator&=  operator|=   operator^=   operator~ 进行二进制与、或、异或及非
    const std::string pattern_str{"1001"};
    std::bitset<16> pattern{pattern_str}, dest;

    for (std::size_t i = dest.size()/pattern_str.size(); i != 0; --i)
    {
        dest <<= pattern_str.size();
        dest |= pattern;
        std::cout << dest << " (i = " << i << ")\n";
    }

    std::cout << ~dest << " (~dest)\n";

    //operator<<=  operator>>=  operator<<  operator>> 进行二进制左移和右移
    std::bitset<8> b7("01110010");
    std::cout << "initial value: " << b7 << '\n';

    while (b7.any()) {
        while (!b7.test(0)) {
            b7 >>= 1;
        }
        std::cout << b7 << '\n';
        b7 >>= 1;
    }

    //set 将位置为 true 或者提供的值
    std::bitset<8> b8;
    for (size_t i = 1; i < b8.size(); i += 2) {
        b8.set(i);
    }
    std::cout << "b8=================" << b8 << '\n';
    //reset  将位置为 false
    std::bitset<8> b9(43);
    std::cout << "b9 Bitset is        " << b9 << '\n';
    b9.reset(0);
    std::cout << "b9.reset(0) is      " << b9 << '\n';

    std::bitset<8> b10(42);
    std::cout << "b10 Bitset is       " << b10 << '\n';
    b10.reset(1);
    std::cout << "After b10.reset(1): " << b10 << '\n';
    b10.reset();
    std::cout << "After b10.reset():  " << b10 << '\n';

    //flip  翻转位的值
    std::bitset<4> b11;
    std::cout << "b11===========" << b11 << "\n";
    std::cout << "b11.flip(0)===" << b11.flip(0) << '\n';
    std::cout << "b11.flip(2)===" << b11.flip(2) << '\n';
    std::cout << "b11.flip()====" << b11.flip() << '\n';


    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

 5.转换

to_string

返回数据的字符串表示
(公开成员函数)

to_ulong

返回数据的 unsigned long 整数表示
(公开成员函数)

to_ullong

(C++11)

返回数据的 unsigned long long 整数表示
(公开成员函数)

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    //转换
    //to_string    返回数据的字符串表示
    std::bitset<8> b(42);
    std::cout << b.to_string() << '\n'
              << b.to_string('*') << '\n'
              << b.to_string('O', 'X') << '\n';
    //to_ulong  返回数据的 unsigned long 整数表示
    for (unsigned long i = 0; i < 10; ++i) {
        std::bitset<5> b(i);
        std::bitset<5> b_inverted = ~b;
        std::cout << i << '\t';
        std::cout << b << '\t';
        std::cout << b_inverted << '\t';
        std::cout << b_inverted.to_ulong() << '\n';
    }

    //to_ullong 返回数据的 unsigned long long 整数表示
    std::bitset<std::numeric_limits<unsigned long long>::digits> b11(0x123456789abcdef0LL);

    std::cout << "b11====" << b11 << "  " << std::hex << b11.to_ullong() << '\n';
    b11.flip();
    std::cout << "b11====" << b11 << "  " << b11.to_ullong() << '\n';
    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

 

参考:

std::bitset - cppreference.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值