bitset 容器中的每一个元素都是一些二进制位,该容器就是用来处理位运算。
// 1. bitset 容器的创建
void test01()
{
// 1. 创建空的 bitset 容器
bitset<8> b1; // 尖括号中编写二进制位的个数
cout << b1 << endl;
// 2. 通过字符串创建一个 Bitset 容器
string s1 = "00010011";
const char* s2 = "00000011";
bitset<8> b2(s1);
bitset<2> b3(s2);
cout << b2 << " " << b3 << endl;
// 注意:
// 1. 使用字符串构建 bitset 容器时,如果字符串中出现非0、非1的值,将会导致程序终止。需要捕获处理 invalid_argument 异常
// 2. 如果字符串的二进制位数比 bitset 设置的长度大,会导字符串右侧多出二进制位丢弃
// 3. 使用数字来构建 bitset 容器对象
bitset<32> b4(8); // 会将8的二进制位存储到容器中 00001000
cout << b4 << endl;
}
// 2. bitset 容器中的二进制位操作
void test02()
{
bitset<8> b("00000011");
// 1. 可以访问某个二进制位,或者修改某个二进制位
// 下标为0访问的是二进制位的低位
cout << b[0] << " " << b[1] << " " << b[2] << endl;
b[0] = 100; // 使用下标给某个二进制位赋值的时,如果给的不是0、1,也不会导致程序终止。会将非0的指转换为1
cout << b << endl;
// 2. 将某个二进制位、所有的位设置为 1
b.set(0, 0); // 第一个参数表示位置,第二个参数表示要设置的值
b.set(0, 1); // 简化: b.set(0)
b.set(); // 表示将所有的二进制位设置为 1
cout << b << endl;
// 3. 将某个二进制位设置为 0,或者将所有的二进制位设置为0
b.reset(0);
cout << b << endl;
b.reset(); // 将所有的二进制位设置为 0
cout << b << endl;
// 4. 将某个二进制位进行反转。原来是1的话,修改成0;原来是0,修改为1.
b.flip(0); // 将下标为0的二进制位进行反转
cout << b << endl;
b.flip(0);
cout << b << endl;
}
void test03()
{
bitset<8> b("11111110");
// 1. 打印二进制位的个数
cout << b.size() << endl;
// 2. bitset 中有多少个1
cout << b.count() << endl;
// 3. 判断 bitset 中有没有 1, 返回 true, 否则返回 false
cout << boolalpha << b.any() << endl;
// 4. 判断 bitset 中是否没有 1, 如果没有返回 true, 否则返回 false
cout << boolalpha << b.none() << endl;
// 5. 判断 bitset 中是否全部是1,如果是,返回 true, 否则返回 false
cout << boolalpha << b.all() << endl;
// 6. 判断某一个二进制位是否是1,如果是,返回 true, 否则返回 false
cout << boolalpha << b.test(0) << endl;
}
// 3. bitset 容器位运算
// 位或、位与、位异或、位取反、左移、右移
void test04()
{
int num1 = 2;
int num2 = 3;
bitset<8> b1(num1);
bitset<8> b2(num2);
cout << b1 << endl;
cout << b2 << endl;
cout << "----------" << endl;
cout << (b1 | b2) << endl;
cout << (b1 & b2) << endl;
cout << (b1 ^ b2) << endl;
cout << (~b1) << endl;
cout << (b1 << 1) << endl;
cout << (b2 >> 1) << endl;
}
// 4. bitset 数值转换
void test05()
{
int number = 10;
bitset<8> b(number);
b <<= 1;
// 可以将二进制位转换为相应的数字
cout << b.to_ullong() << endl;
cout << b.to_ulong() << endl;
cout << b.to_string() << endl;
}
// 5. bitset 容器使用案例
// 从键盘输入一个数字,判断该数字的奇偶性
void test06()
{
int number;
cout << "请输入一个数字:";
cin >> number;
// 1. 第一种方法
/*if (number % 2 == 0)
{
cout << "偶数" << endl;
}
else
{
cout << "奇数" << endl;
}*/
// 2. 第二种方法 00000011
/*if ((number & 1) == 0)
{
cout << "偶数" << endl;
}
else
{
cout << "奇数" << endl;
}*/
// 3. 使用 bitset 容器
bitset<32> b(number);
if (b.test(0))
{
cout << "奇数" << endl;
}
else
{
cout << "偶数" << endl;
}
}

冀公网安备13050302001966号