利用位运算控制开关灯问题
利用位运算控制开关灯问题
问题描述:俱乐部一共有32盏灯,设计一个灯光控制系统,共有4部分区域,其中台球部8盏,桌游区8盏,酒吧区8盏,休息区8盏,要求满足以下功能:
能独立控制每一盏灯
能一次性打开或关闭一个区域的全部灯光
能获取各个区域的灯开关情况
能一次性打开所有关闭的,关闭打开的灯
所用知识:
1.c++基础语法
2.位运算<< ,>> , & , |
3.进制转换知识
代码展示页面
#include <iostream>
#include <bitset>
using std::cout;
using std::cin;
int main()
{
unsigned int test1{ 0x0 }; // 台球 桌游 酒吧 休息
unsigned int x;
// 默认所有灯都是关闭的
std::cout<<"灯现有的状态" << std::bitset<32>(test1) << (char)10; // 分为32位 0000 0000 0000 0000 0000 0000 0000 0000
cout << "请输入要开关的灯号码(1-32)" << (char)10;
cin >> x; // 选择开哪一盏灯
unsigned int k{ 0x1 }; // 开灯的开关 0001
test1 = test1 | k; // 按位或运算 先开一盏灯
test1 <<= (32-x); // 一共32个灯 开第n个 32-n
cout << "当前所有灯的状态" << std::bitset<32>(test1) << (char)10;
cout << "请输入要关闭的区域(1-4)" << (char)10;
cin >> x;
unsigned int k2{ 0xff000000 }; // 初始化为第一区域
k2 >>= (8*(x-1)); // 四个区域则为 每个区域为8位 所以(8*(x-1)
test1 = test1 & (~k2);
// 当前test1的开灯状态 可能有开灯的 把k2按位取反则可以获取 要关闭的区域全为0 其他区域则为1
// 再执行按位与 同真则真 有假则假 则实现关闭选的区域的灯
cout << "当前所有灯的状态" << std::bitset<32>(test1) << (char)10;
cout << "请输入要打开的区域(1-4)" << (char)10;
cin >> x;
unsigned int k3{ 0xff000000 };
k3 >>= (8 * (x - 1)); // 同关闭
test1 = test1 | k3; // 开启与关闭相反 不需要按位取反 直接执行 按位或运算符 有真则真 同假为假
cout << "当前所有灯的状态" << std::bitset<32>(test1) << (char)10;
cout << "打开所有关闭的,关闭打开的灯" << (char)10;
unsigned int k4{0xffffffff };
test1 = test1 ^ k4; // 异或运算符(^) 运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
cout << "当前所有灯的状态" << std::bitset<32>(test1) << (char)10;
}