C语言基于二进制以及位运算模拟点灯控制装置

在所有运算符中,位运算符是针对二进制而言的,位指的是 bit位,不管几进制的数据,只要是做位运算,都会转换成二进制参与运算。一般多用于硬件设备的控制和标志位的控制等。所以除了要了解位云算符的含义,还需对硬件设备有初步简单的了解。

一、位运算符

运算符运算符名称运算符其含义解释说明
&按位与按位运算,全1则1,有0则0
|按位或按位运算,有1则1,全0则0
^   按位异或按位运算,不同为1,相同为0
~按位取反按位运算,0变1,1变0
<<按位左移向左移动,舍弃低位,地位补0
>>按位右移向右移动,舍弃低位,高位补0

例子 

int main(int argc, const char *argv[])
{
	unsigned char a = 0xB9; //1011 1001
	unsigned char b = 0x97; //1001 0111
	unsigned char c = 0;

	//按位与 &
	//a:1011 1001
	//b:1001 0111
	// &
	//c:1001 0001 -->0x91
	c = a & b;
	printf("c = %#x\n", c);//0x91

	//按位或 |
	//a:1011 1001
	//b:1001 0111
	// |
	//c:1011 1111 -->0xbf
	c = a | b;
	printf("c = %#x\n", c);//0xbf

	//按位异或 ^
	//a:1011 1001
	//b:1001 0111
	// ^
	//c:0010 1110 -->0x2e
	c = a ^ b;
	printf("c = %#x\n", c);//0x2e

	//按位取反 ~
	//a:1011 1001
	// ~
	//c:0100 0110 -->0x46
	c = ~a;
	printf("c = %#x\n", c);//0x46

	//按位左移 <<
	//a:1011 1001
	// <<2
	//c:1110 0100 -->0xe4
	c = a<<2;
	printf("c = %#x\n", c);//0xe4

	//按位右移 >>
	//a:1011 1001
	// >>2
	//c:0010 1110 -->0x2e
	c = a>>2;
	printf("c = %#x\n", c);//0x2e

	return 0;
}

 二、模拟点灯

已知条件:

8个灯采用共阴极的接法

给引脚赋值高电平1,灯亮、低电平0,灯灭

灯的编号:

7 6 5 4 3 2 1 0

 

有8个LED灯,初始状态未知:

1.点亮1357号灯;

2.将6号灯点亮;

3.将5号灯熄灭;

int main(int argc, const char *argv[])
{
	unsigned char led = 0;
	//点亮1357号灯
	//led = 0xaa;//1010 1010 //使用直接赋值的方式 可以点亮 但是会影响其他位
	led = led | 0xaa; //使用位运算可以做到不影响其他位
	printf("led = %#x\n", led);//0xaa

	//点亮6号灯
	//led = led | 0x40;
	led = led | (1<<6);//上面的写法也可以 这种更好一些
	printf("led = %#x\n", led);//0xea

	//熄灭5号灯
	//led = led & 0xdf;
	led = led & ~(1<<5);//上面的写法也可以 这种更好一些
	printf("led = %#x\n", led);//0xca

	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值