bitset使用及函数
bitset
简称位集,是一种特殊的容器类,旨在存储位(只有两个可能值的元素:0 或 1,true 或 false
,…)。
该类与常规数组非常相似,但是针对空间分配进行了优化:每个元素仅占用一位(比C ++中最小的元素类型char
少八倍)。
每个元素(每个位)都可以单独访问:例如,对于给定的名为 mybitse
的位集,表达式 mybitset [3]
访问其第四位,就像常规数组访问其元素一样。
因为在大多数C ++环境中不存在如此小的元素类型,所以可以将单独的元素作为模仿 bool 元素的特殊引用进行访问:
除了覆盖多个运算符并提供对位的直接访问之外,位集还具有可以从整数值和二进制字符串构造并转换为整数值和二进制字符串的功能(请参见构造函数,bitset :: to_ulong 和 bitset :: to_string
)。 它们也可以直接以二进制格式插入流中并从流中提取。
位集具有固定的大小。 对于同样优化空间分配并允许动态调整大小的类似容器类,请参见vector的bool专门化(vector <bool>
)。
构造位集
构造一个位集容器对象。如果使用默认构造函数,则用零初始化位集,否则其初始内容取决于所使用的参数:
bitset ( );
bitset ( unsigned long val );
例题:
//构造位集
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main (){
bitset<10> first; // 空位集
bitset<10> second (120ul); // initialize from unsigned long
bitset<10> third (string("01011")); // initialize from string
return 0;
}
该代码不会产生任何输出,但是演示了一些构造位集容器的方法。
位集可用的运算符
与其他容器类相比,位集容器支持一组不同的运算符,主要是为了支持按位运算符并允许将它们直接插入流中或从流中提取。所有这些运算符都为位集容器模拟适用于基本数据类型的按位逻辑。
// bitset operators
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main (){
bitset<4> first (string("1001"));
bitset<4> second (string("0011"));
cout << (first^=second) << endl; // 1010 (XOR,assign)
cout << (first&=second) << endl; // 0010 (AND,assign)
cout << (first|=second) << endl; // 0011 (OR,assign)
cout << (first<<=2) << endl; // 1100 (SHL,assign)
cout << (first>>=1) << endl; // 0110 (SHR,assign)
cout << (~second) << endl; // 1100 (NOT)
cout << (second<<1) << endl; // 0110 (SHL)
cout << (second>>1) << endl; // 0001 (SHR)
cout << (first==second) << endl; // false (0110==0011)
cout << (first!=second) << endl; // true (0110!=0011)
cout << (first&second) << endl; // 0010
cout << (first|second) << endl; // 0111
cout << (first^second) << endl; // 0101
return 0;
}
位集中的“位”访问
bitset::operator[ ]
bool operator[] ( size_t pos ) const;
存取位:该函数将值(或引用)返回到位置pos
处的位。使用此运算符,不会执行范围检查。 使用bitset :: test
读取已检查位集界限的值。
// bitset::operator[]
#include <iostream>
#include <bitset>
using namespace std;
int main (){
bitset<4> mybits;=
mybits[1]=1; // 0010
mybits[2]=mybits[1]; // 0110
cout << "mybits: " << mybits << endl;
return 0;
}
位集中的“位”操作
bitset::set
bitset<N>& set ( );
bitset<N>& set ( size_t pos, bool val = true );
设置位:没有参数的版本会将 位集 中的所有位设置(设置为1)。参数化版本将 val 存储为位置 pos 的新位值。
// bitset::set
#include <iostream>
#include <bitset>
using namespace std;
int main (){
bitset<4> mybits;
cout << mybits.set() << endl; // 1111
cout << mybits.set(2,0) << endl; // 1011
cout << mybits.set(2) << endl; // 1111
return 0;
}
bitset::reset
bitset<N>& reset ( );
bitset<N>& reset ( size_t pos );
重置位:没有参数的版本将重置 位集 中的所有位(将所有位设置为0)。参数化版本将位置 pos 的位复位(设置为0)。
// bitset::reset
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main (){
bitset<4> mybits (string("1011"));
cout << mybits.reset(1) << endl; // 1001
cout << mybits.reset() << endl; // 0000
return 0;
}
bitset::flip
bitset<N>& flip ( );
bitset<N>& flip ( size_t pos );
翻转位:没参数版会翻转 位集 中的所有位,即将全 0 更改为 1,将全 1 更改为 0。参数化版仅翻转位置 pos 处的位。一元运算符〜
执行与flip()相同的操作。
// bitset::flip
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main (){
bitset<4> mybits (string("0001"));
cout << mybits.flip(2) << endl; // 0101
cout << mybits.flip() << endl; // 1010
return 0;
}
位集的操作
bitset::to_ulong
unsigned long to_ulong ( ) const;
转换为无符号长整数。返回一个无符号长整数,其整数值与位集具有相同的位集。
// bitset::to_ulong
#include <iostream>
#include <bitset>
using namespace std;
int main (){
bitset<4> mybits; // mybits: 0000
mybits.set(); // mybits: 1111
cout << mybits << " as an integer is: " << mybits.to_ulong() << endl;
return 0;
}
Output: 1111 as an integer is: 15
bitset::to_string
basic_string<charT,traits,Allocator> to_string() const;
转换为字符串。构造一个basic_string对象,该对象将位集表示为连续的零和一。请注意,此功能模板使用模板参数定义返回类型。 因此,它们不是由编译器隐式推导的。
// bitset::to_string
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main (){
string mystring;
bitset<4> mybits; // mybits: 0000
mybits.set(); // mybits: 1111
mystring=mybits.to_string<char,char_traits<char>,allocator<char> >();
cout << "mystring: " << mystring << endl;
return 0;
}
Output: 1111
bitset::count
size_t count ( );
计数位设置。返回设置的位集中的位数(即值为1)。
// bitset::count
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main (){
bitset<8> myset (string("10110011"));
cout << "myset has " << int(myset.count()) << " ones ";
cout << "and " << int(myset.size()-myset.count()) << " zeros.\n";
return 0;
}
Output: myset has 5 ones, and 3 zeros.
bitset::size
size_t size() const;
返回大小。返回位集中的位数。
// bitset::size
#include <iostream>
#include <bitset>
using namespace std;
int main (){
bitset<8> first;
bitset<4> second;
cout << "first.size() is " << (int) first.size() << endl;
cout << "second.size() is " << (int) second.size() << endl;
return 0;
}
Output:
first.size() is 8
second.size() is 4
bitset::test
bool test ( size_t pos ) const;
返回位值。返回是否设置了位集中位置pos的位。与访问运算符([ ])不同,此函数在检索位值之前对 pos 执行范围检查。
// bitset::test
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main (){
bitset<5> mybits (string("01011"));
cout << "mybits contains:\n";
cout << boolalpha;
for (size_t i=0; i<mybits.size(); ++i)
cout << mybits.test(i) << endl;
return 0;
}
Output:
mybits contains:
true
true
false
true
false
bitset::any
bool any ( ) const;
测试是否设置了任何位。返回是否设置了位集中的任何位。
// bitset::any
#include <iostream>
#include <bitset>
using namespace std;
int main (){
bitset<16> mybits;
cout << "enter a binary number: ";
cin >> mybits;
if (mybits.any())
cout << "mybits has " << (int)mybits.count() << " bits set.\n";
else cout << "mybits has no bits set.\n";
return 0;
}
bitset::none
bool none ( ) const;
测试是否未设置。返回是否未设置位集中的所有位。
// bitset::none
#include <iostream>
#include <bitset>
using namespace std;
int main (){
bitset<16> mybits;
cout << "enter a binary number: ";
cin >> mybits;
if (mybits.none()){
cout << "mybits has no bits set.\n";
}
else{
cout << "mybits has " << (int)mybits.count() << " bits set.\n";
}
return 0;
}