菜鸟日记之位运算

位运算符(对整个变量的某一位进行操作)主要包括位逻辑反~、位逻辑与&、位逻辑或|、位逻辑异或、左移<< 、右移>>。下面是几种位运算符的具体解释:


~ : 按位取反---单目运算符,数据将每一个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;
}

运行结果如下:

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值