在所有运算符中,位运算符是针对二进制而言的,位指的是 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;
}