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

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于C语言左移位符号 << 结合 =| 实现置位操作的主要内容,如果未能解决你的问题,请参考以下文章

如何理解C语言的左结合 和右结合性

位操作

移位操作符

C和C指针小记-操作符

C语言(文件的移位与加密解密)

总结——C语言操作符。