bitset使用详解
一、bitset场景
bitset
是C++标准库中的一个类,它表示二进制位的集合,其最大的优点就是可以在代码中快速高效地处理二进制。
bitset
通常应用于各种算法问题中,例如图论中的状态压缩、编码解码,压缩算法中的哈夫曼编码等等。同时,bitset
还能够应用于大数据处理、数据筛选等场景下。
例如,当一种结构体需要根据某种属性进行排序时,如果该属性是bool类型,那么使用bitset
可以将排序的效率提升很多。
二、bitset长度
bitset
的长度是指其中的二进制位个数,一般为一个整数类型除以8的结果。既然bitset
的单位是二进制位,因此它的长度只能是8的倍数!
对于C++标准库中的bitset
,长度是个常数。示例代码如下:
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> bs; //长度是8
std::cout << bs.count() << std::endl; //输出0
return 0;
}
三、bitset操作
bitset
本质上就是一个二进制数,因此它可以进行多种二进制操作:
1. set和reset
set
和reset
操作分别将bitset
的某个二进制位设为1或0。
示例代码:
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> bs(42); //二进制表示为00101010
bs.set(1); //将第1位(从右往左数,从0开始)设置为1
bs.reset(3); //将第3位设置为0
std::cout << bs.to_ulong() << std::endl; //输出结果为46,二进制表示为00101110
return 0;
}
2. flip
flip
操作将bitset
的某个二进制位取反,即1变为0,0变为1。
示例代码:
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> bs(42); //二进制表示为00101010
bs.flip(1); //将第1位(从右往左数,从0开始)取反
std::cout << bs.to_ulong() << std::endl; //输出结果为46,二进制表示为00101110
return 0;
}
3. 数组操作
由于bitset
本质上就是一个二进制数,因此它也可以被看成一个bool型数组,数组的下标对应于二进制数的位置。
示例代码:
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> bs(42); //二进制表示为00101010
std::cout << bs[1] << std::endl; //输出1
std::cout << bs[3] << std::endl; //输出0
bs[3] = 1; //将第3位(从右往左数,从0开始)设置为1
std::cout << bs.to_ulong() << std::endl; //输出58,二进制表示为00111010
return 0;
}
四、bitset存储原理
bitset
在内存中的存储和使用也非常特殊,在标准库中的实现一般采用一个unsigned long long
的数组进行存储。举例来说,如果bitset
的长度为64,那么就需要一个unsigned long long
来存储;如果bitset
的长度为80,那么就需要两个unsigned long long
来存储。
五、bitset乘法
bitset
相乘只能对其长度以及一些位数样式相同的bitset
进行。
示例代码:
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> b1(42); //0010 1010
std::bitset<8> b2(99); //0110 0011
std::bitset<8> b3;
b3 = b1 & b2; //0010 0010
std::cout << b3.to_ulong() << std::endl; //输出34
b3 = b1 | b2; //0110 1011
std::cout << b3.to_ulong() << std::endl; //输出107
b3 = b1 ^ b2; //0100 1001
std::cout << b3.to_ulong() << std::endl; //输出73
return 0;
}
六、bitset查询连续1个数
bitset
可以快速查找其中连续1的个数,使用count
方法即可。
示例代码:
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> b1(42); //0010 1010
std::bitset<8> b2(58); //0011 1010
std::cout << b1.count() << std::endl; //输出3
std::cout << b2.count() << std::endl; //输出4
return 0;
}