C++ bitset——高端压位卡常题必备STL
bitset储存二进制数位,和bool数组差不多,不过有空间优化,bitset中一个元素只占1bit,相当于一个char元素所占空间的八分之一。
bitset中的每个元素都像数组一样单独访问,下标从最右侧以0开始
使用bitset需要像数组一样提前确定大小
定义一个bitest
-
定义一个已知长度的全为0的bitset,n必须是常量表达式,例如const或者define定义过的的
conest int n = 100; #define n 100 bitset<n>b;
-
将一个十进制数x转换成二进制存在n位的bitset中,n小于等于unsigned long的最大值,如果x转换成2进制的长度len小于n,则高阶位补0;如果len大于n,则只保留低阶位的前n位,比如100转换成二进制是1100100,如果bitset只定义了5位,则bitset为00100,如果bitset定义了10位,则bitset为0001100100
int n; cin>>n; bitset<10>b(n);
-
将01字符串转换成bitset,注意!必须是01串,不然会re,有三个参数(s, pos, len),s即所需转换的字符串,pos为s的开始位置,len需要转换的长度,通常来说后两个省略的时候就默认是从头开始。如果s的长度大于n,则取s的前n位,如果s的长度小于n,则给高位补0,例如s = "111000",n为5时,bitest为11100,n为8时,bitset为00111000
string s; cin>>s; bitset<10>b(s); string s; int pos, len; cin>>s; cin>>pos>>len; bitset<10>b(s, pos, len);
bitset的函数们
再次重申一遍,因为bitset是储存的二进制,所以下标是从最右侧以0开始,往左依次增大
- b.set() 将b的所有位都置1
- b.set(pos) 将b的第pos+1位置置1
- b.reset() 将b的所有位都置0
- b.reset(pos) 将b的第pos+1位置置0
- b.flip() 将b全部位置都取反
- b.flip(pos) 将b的第pos + 1位取反
- b.count() 返回1的个数
- b.size() 返回b的大小
- b.any() 返回是否有1
- b.to_ulong() 返回它转换为unsigned long的结果
- b.to_ullong() 返回它转换成unsigned long long的结果
- b.to_string() 返回它转换成string的结果
bitset的位运算们
bitset的位运算和普通的整数一样,可以&、|、^、<<、>>、~
bitset<10>b("1110001100");
bitset<10>c;
b ^= 7;
b &= 10;
b |= 3;
b >>= 2;
b <<= 5;
c = ~b;