位运算符(对整个变量的某一位进行操作)主要包括位逻辑反~、位逻辑与&、位逻辑或|、位逻辑异或、左移<< 、右移>>。下面是几种位运算符的具体解释:
~ : 按位取反---单目运算符,数据将每一个bit位取反,1变0,0变1
&:按位与,两个都为1,结果才为1
1&1==1;1&0==0;0&0==0;0&1==0
结论
:
一个bit位与0进行“按位与 &”操作,结果为0 : x & 0 == 0
一个bit位与1进行"按位与 &"操作,保留原值 : x & 1 == x
| :按位或,两个都为1,结果才为1
1|1==1; 1|0==1; 0|1==1; 0|0==0;
结论
:
一个bit位与0进行“按位或 |”操作,保留原值:
x | 0 == x
一个bit位与1进行“按位或 |”操作,结果为1 :
x | 1 == 1
^ : 按位异或 --- 不同为1,相同为0
1^0==1; 0^1==1; 0^0==0; 1^1==0
结论
:
一个bit位与0进行“按位异或 ^”操作,保留原值 :
x ^ 0 == x
一个bit位与1进行"按位异或 ^"操作,结果取反 :
x ^ 1 == ~x
<< : 左移,按bit位往左移动
>>:右移,按bit位往右移动
左移 高位丢弃,低位补
0
右移 低位丢弃, 高位:是否有符号 无符号 补
0
有符号 补 符号位
下面是一个对于位运算操作的例子:
假设有一个整型变量
a,
要把
a
的第
5bit
变为
0,
其他
bit
位不变,该如何操作?
对于这个例子,不难想到按位与操作,任一bit位与0按位与都得0,任一bit位与1按位与都保留原值,故将整型变量a与一个第五bit位为0,其余bit位为1的数进行按位与即可得到想要的结果。即:
a &(11111111 11111111 11111111 11011111),
那么如何得到这个数,通过观察我们不难发现,若是将此数右移五个bit位得到~1。故得到思路:将1左移五位后,按位取反即可得到该数。因此得到答案:a & ~(1<<5)。
同理:
有一个整型变量
a,
要使
a
的第
5bit
置
1,
其他
bit
位不变, 该如何操作?
a
|
(
1
<<
5
)
有一个整型变量
a,
要使
a
的第
5bit
位保留,其他位取反, 该如何操作?
a
^
(
~
(
1
<<
5
))
位运算综合题:
现有一个嵌入式设备终端传输过来的数据包是一个32位无符号的整型数,这个数据包里面各位含义如下:
- 00-07位:表示温度数据
- 08-15位:表示湿度数据
- 16-19位:表示4扇门状态(门的编号0-3)
- 20-23位:表示四盏灯的状态(灯编号0-3)
- 24-31位:预留备用
下面是最近一段时间接受的数据包
0x12344520, 0xff004B1C,0x00553C1E
请编写一个程序接收这3个数据包,并解析出对应的数据【温度,湿度,门0-3,灯0-3】(门和灯的状态0-关,1-开)。
#include <stdio.h>
int main()
{
unsigned int data[3] = {0x12344520, 0xff004B1C, 0x00553C1E};//定义一个数组用于存储所接受的三个数据包
for (int i = 0; i < 3; i++)
{
unsigned int temp = data[i];//用变量temp存储数据包的数据
int temperature = (temp & 0xff);
int humidity = (temp >> 8) & 0xff;
int doorStatus[4];//定义一个整型数组存储四个门的状态
doorStatus[0] = (temp >> 16) & 0x01;
doorStatus[1] = (temp >> 17) & 0x01;
doorStatus[2] = (temp >> 18) & 0x01;
doorStatus[3] = (temp >> 19) & 0x01;
int lightStatus[4];//定义一个整型数组存储四个灯的状态
lightStatus[0] = (temp >> 20) & 0x01;
lightStatus[1] = (temp >> 21) & 0x01;
lightStatus[2] = (temp >> 22) & 0x01;
lightStatus[3] = (temp >> 23) & 0x01;
printf("数据包 %d:\n", i + 1);
printf("温度: %d\n", temperature);
printf("湿度: %d\n", humidity);
printf("门的数据: ");
for (int j = 0; j < 4; j++)
{
printf("%d ", doorStatus[j]);
}
printf("灯的数据: ");
for (int j = 0; j < 4; j++)
{
printf("%d ", lightStatus[j]);
}
printf("\n");
}
return 0;
}
运行结果如下: