目录
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
}