请教一下关于|和&的使用

经常看到一些系统的源码或者c的源码,如下:

#define R 1
#define B 2
#define C 4
#define D 8

run_some_function(R|B|C);

定义的时候均使用了2的某次方,使用的时候,使用|或者&组合,有哪位大神能详细讲解一下这里面的原理么?

阅读 2.3k
2 个回答

补充楼上
这种二进制且(&)或(|)的操作是在设置标志位(flag)
通过楼上你可以发现 0-f 每个数都可以看做是四位二进制
通过不同数字的且或操作 会映射到一个最终的四位二进制上
即这个二进制串上哪些位是0 哪些是1

比如说
我们规定

_ _
0位定义为选项A
1位定义为选项B
...

那么
0100
的意思就是 只打开选项B 其他保持关闭

所以只要设计好某个十六进制/十进制数对应的开关意思
那么你对它们的任意组合到最后都可以被作为一个二进制串去解析你打开了哪些标志位

1 0001
2 0010
4 0100
8 1000

0001 | 0010 = 0011

后面不用我说了吧!

补全吧还是

1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
a 1010
b 1011
c 1100
d 1101
e 1110
f 1111

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题