利用位运算控制开关灯问题

文章介绍了一个使用C++和位运算来控制32盏灯的系统,该系统分为四个区域,每个区域8盏灯。能独立控制每一盏灯,一键开关某个区域的所有灯光,查询各区域灯的状态,以及一键切换所有灯的状态。主要涉及位运算符如<<,>>,&和|,以及进制转换知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用位运算控制开关灯问题

利用位运算控制开关灯问题

问题描述:俱乐部一共有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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清安.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值