STL bitset 存储二进制位的容器

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;
	}
}
未经允许不得转载:一亩三分地 » STL bitset 存储二进制位的容器
评论 (0)

6 + 8 =