C++容器之位集(std::bitset)

1 概述

  位集存储位(只有两个可能值的元素:0或1,true或false,…)。
  该类模拟bool元素的数组,但针对空间分配进行了优化:通常,每个元素只占用一个位(在大多数系统上,这比最小的元素类型char少八倍)。
  每个比特位置都可以单独访问:例如,对于一个名为foo的给定比特集,表达式foo[3]访问其第四个比特,就像正则数组访问其元素一样。但是,因为在大多数C++环境中,没有元素类型是单个位,所以各个元素都是作为特殊引用类型访问的(请参见bitset::reference)。
  位集具有能够从整数值和二进制字符串构造并转换为它们的特性(请参见其构造函数和成员to_ulong和to_string)。它们也可以直接从二进制格式的流中插入和提取(请参阅适用的运算符)。
  位集的大小在编译时是固定的(由其模板参数决定)。对于一个同时优化空间分配并允许动态调整大小的类,请参阅向量的布尔特化(vector<bool>)。

其类图如下:
类图

2 使用实例

void BitsetSuite::operators()
{
    std::bitset<4> a (std::string("1001"));
    std::bitset<4> b (std::string("0011"));

    TEST_ASSERT_EQUALS("1010", (a ^= b).to_string())//XOR,assign
    TEST_ASSERT_EQUALS("0010", (a &= b).to_string())//AND,assign
    TEST_ASSERT_EQUALS("0011", (a |= b).to_string())//OR,assign

    TEST_ASSERT_EQUALS("1100", (a <<= 2 ).to_string())//Shitf left,assign
    TEST_ASSERT_EQUALS("0110", (a >>= 1 ).to_string())//Shitf right,assign

    TEST_ASSERT_EQUALS("1100", (~b).to_string())//NOT
    TEST_ASSERT_EQUALS("0110", (b << 1 ).to_string())//Shitf left
    TEST_ASSERT_EQUALS("0001", (b >> 1 ).to_string())//Shitf left

    TEST_ASSERT_EQUALS(false, (a == b))//(0110==0011)
    TEST_ASSERT_EQUALS(true, (b != a)) //(0011!=0110)

    TEST_ASSERT_EQUALS("0101", (a ^ b).to_string())//XOR
    TEST_ASSERT_EQUALS("0010", (a & b).to_string())//AND
    TEST_ASSERT_EQUALS("0111", (a | b).to_string())//OR
}

3 接口使用

3.1 constructor

void BitsetSuite::constructor()
{
    std::bitset<16> a;//noexcept
    std::bitset<16> b(0xFFFFFFFF);//noexcept
    std::bitset<16> c("01010101");
    TEST_ASSERT_EQUALS(0, a.to_ulong())
    TEST_ASSERT_EQUALS(0xFFFF, b.to_ulong())
    TEST_ASSERT_EQUALS(0b1010101, c.to_ulong())
}

3.2 count_and_size

void BitsetSuite::count_and_size()
{
    std::bitset<16> a;
    std::bitset<16> b("11111111");
    TEST_ASSERT_EQUALS(0, a.count())
    TEST_ASSERT_EQUALS(16, a.size())
    TEST_ASSERT_EQUALS(8, b.count())
    TEST_ASSERT_EQUALS(16, b.size())
}

3.3 test

void BitsetSuite::test()
{
    std::bitset<6> a ("101010");
    TEST_ASSERT_EQUALS(false, a.test(0))
    TEST_ASSERT_EQUALS(true, a.test(1))
    TEST_ASSERT_EQUALS(false, a.test(2))
    TEST_ASSERT_EQUALS(true, a.test(3))
    TEST_ASSERT_EQUALS(false, a.test(4))
    TEST_ASSERT_EQUALS(true, a.test(5))
    bool hasException = false;
    try
    {
        TEST_ASSERT_EQUALS(true, a.test(6))
    }
    catch(...)
    {
        hasException = true;
    }
    TEST_ASSERT_EQUALS(true, hasException)
}

3.4 any

void BitsetSuite::any()
{
    std::bitset<4> a;
    std::bitset<4> b("0100");
    TEST_ASSERT_EQUALS(false, a.any())
    TEST_ASSERT_EQUALS(true, b.any())
}

3.5 none

void BitsetSuite::none()
{
    std::bitset<4> a;
    std::bitset<4> b("0100");
    TEST_ASSERT_EQUALS(true, a.none())
    TEST_ASSERT_EQUALS(false, b.none())
}

3.6 all

void BitsetSuite::all()
{
    std::bitset<4> a("1111");
    std::bitset<4> b("0100");
    TEST_ASSERT_EQUALS(true, a.all())
    TEST_ASSERT_EQUALS(false, b.all())
}

3.7 set

void BitsetSuite::set()
{
    std::bitset<4> a;
    a.set();
    TEST_ASSERT_EQUALS(true, a.all())
    a.set(0, false);
    TEST_ASSERT_EQUALS(false, a.test(0))
    a.set(0);
    TEST_ASSERT_EQUALS(true, a.test(0))
}

3.8 reset

void BitsetSuite::reset()
{
    std::bitset<4> a("1111");
    a.reset(0);
    TEST_ASSERT_EQUALS(false, a.test(0))//1110
    a.reset();
    TEST_ASSERT_EQUALS(true, a.none())//0000
}

3.9 filp

void BitsetSuite::filp()
{
    std::bitset<4> a("1100");
    a.flip();
    TEST_ASSERT_EQUALS("0011", a.to_string())//0011
}

3.10 to_string

void BitsetSuite::to_string()
{
    std::bitset<4> a;
    std::bitset<4> b(0xF);
    TEST_ASSERT_EQUALS("0000", a.to_string())
    TEST_ASSERT_EQUALS("1111", b.to_string())
}

3.11 to_ulong

void BitsetSuite::to_ulong()
{
    std::bitset<4> a;
    std::bitset<4> b("1111");
    std::bitset<64> c("1111111111111111111111111111111111111111111111111111111111111111");
    std::bitset<66> d("111111111111111111111111111111111111111111111111111111111111111111");
    TEST_ASSERT_EQUALS(0, a.to_ulong())
    TEST_ASSERT_EQUALS(0xF, b.to_ulong())
    TEST_ASSERT_EQUALS(0xFFFFFFFFFFFFFFFF, c.to_ulong())
    bool hasException = false;
    try
    {
       TEST_ASSERT_EQUALS(0xFFFFFFFFFFFFFFFF, d.to_ulong())
    }
    catch(...)
    {
        hasException = true;
    }
    TEST_ASSERT_EQUALS(true, hasException)
}

3.12 to_ullong

void BitsetSuite::to_ullong()
{
    std::bitset<64> a;
    std::bitset<64> b("1111");
    std::bitset<64> c(0xFFFFFFFFFFFFFFFF);
    std::bitset<128> d(c.to_string() + c.to_string());
    TEST_ASSERT_EQUALS(0, a.to_ullong())
    TEST_ASSERT_EQUALS(0xF, b.to_ullong())

    bool hasException = false;
    try
    {
       TEST_ASSERT_EQUALS(0xFFFFFFFFFFFFFFFF, d.to_ulong())
    }
    catch(...)
    {
        hasException = true;
    }
    TEST_ASSERT_EQUALS(true, hasException)
}

3.13 operators

void BitsetSuite::operators()
{
    std::bitset<4> a (std::string("1001"));
    std::bitset<4> b (std::string("0011"));

    TEST_ASSERT_EQUALS("1010", (a ^= b).to_string())//XOR,assign
    TEST_ASSERT_EQUALS("0010", (a &= b).to_string())//AND,assign
    TEST_ASSERT_EQUALS("0011", (a |= b).to_string())//OR,assign

    TEST_ASSERT_EQUALS("1100", (a <<= 2 ).to_string())//Shitf left,assign
    TEST_ASSERT_EQUALS("0110", (a >>= 1 ).to_string())//Shitf right,assign

    TEST_ASSERT_EQUALS("1100", (~b).to_string())//NOT
    TEST_ASSERT_EQUALS("0110", (b << 1 ).to_string())//Shitf left
    TEST_ASSERT_EQUALS("0001", (b >> 1 ).to_string())//Shitf left

    TEST_ASSERT_EQUALS(false, (a == b))//(0110==0011)
    TEST_ASSERT_EQUALS(true, (b != a)) //(0011!=0110)

    TEST_ASSERT_EQUALS("0101", (a ^ b).to_string())//XOR
    TEST_ASSERT_EQUALS("0010", (a & b).to_string())//AND
    TEST_ASSERT_EQUALS("0111", (a | b).to_string())//OR
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnow010

你的鼓励就是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值