C语言左移位符号 << 结合 =| 实现置位操作

今天看hk文档,有一串代码不是很懂什么意思:

alarm_msg.alarm_linkage.trigger_record_chan |= (0x1 << 1); /* bit1 - record the first channel (为什么要这么操作?)*/

首先x << k = x ^ k,如:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    int a = 0x1 << 1;   //2
    int b = 0x1 << 2;   //4
    int c = 0x1 << 3;   //8
    int d = 0x1 << 4;   //16
    int e = 0x1 << 5;   //32
    int f = 0x1 << 6;   //64
    int g = 0x1 << 7;   //128
    int h = 0x1 << 8;   //256
    int i = 0x1 << 9;   //512

    return 0;
}

再用=|符号可以实现让得某位置1:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
    a |= (0x1);  //1
    b |= (0x1<<1);  //2
    c |= (0x1<<2);  //4
    d |= (0x1<<3);  //8
      
    return 0;
}

有什么用?(根据某大佬的回答。。。)

这个整数的 bits 被视为开关,英文可能为 composite flags 或者 flags。中文可能被翻译成组合值。比如一个 uint32_t 可以表示 32 个相互独立的开关。还有一种是从 1,2,3,4,5 这样一直连续递增的数值(这种整数只看它的整体实际数值,某个 bit 没有任何物理意义),这个应该怎么叫我也不记得了,可能没什么叫法。注意这两者的区别。还有的整数的 bits 被分段划分为同时有以上两种用法(根据设计者的设计)。

参考文章1:C语言为什么要左移位<<?

参考文章2:KYSL 海康摄像头 HEOP报警组件集成开发指南.pdf

上一篇:下面的Java代码保存在B.java文件中是否合法?


下一篇:Spring Cloud实战小贴士:Zuul处理Cookie和重定向