我正在审查一些C代码,并找到了一个完整的样式定义的头文件:
#define BLABLABLABLA (1 << 2)
#define XXXXXXXXXXXX (1 << 3)
#define YYYYYYYYYYYY (1 << 4)
他们是什么意思?他们做了什么?
答案 0 :(得分:4)
&LT;&LT;是C.的转换运算符。 因此,您将BLABLABLABLABLA定义为零值,二进制1向左移动2位数。
结果值是: ... 00000100
你通常会这样做掩盖事物。 所以,假设你有一个状态字节,每个位都是一个标志。 如果第3位置1,这意味着BLABLABLABLABLA,您可以这样做:
int blablaFlag = statusByte&amp; BLABLABLABLABLA;
如果此值大于0,则表示您已设置标记。
答案 1 :(得分:3)
当以位:
存储信息(标志)时,可以使用这些定义#define HAS_SOMETHING (1 << 2)
#define HAS_ANOTHER (1 << 3)
int flags = 0;
if (has_something())
flags |= HAS_SOMETHING;
if (has_another())
flags |= HAS_ANOTHER;
// ... later:
if (flags & HAS_SOMETHING)
do_something();
使用宏预处理程序指令来设置或取消设置这些标志会使代码更具可读性:
if (flags & 4) // 4 is 1 lsh 2
do_something();
答案 2 :(得分:1)
它们是使用C预处理器定义常量的一种方法。因此,每次在代码中使用XXXXXXXXXXXX
时,预处理器都会将其替换为1 << 2
。
答案 3 :(得分:1)
#define
只是意味着只要看到BLABLABLABLA
,它就会被(1 << 2)
替换。
所以,如果你写int x=BLABLABLABLA;
,就好像你写了int x=(1 << 2);
<<
是左移操作员。
答案 4 :(得分:1)
<<
和>>
是 shift 运算符,它们以二进制方式工作。
42以十进制形式写成42,以二进制形式写入101010.
使用运营商时:
The binary representation of 42 is : 101010
42 << 1 : 101010 is "shifted" to the left, becoming 1010100, thus 84.
42 >> 1 : 101010 is "shifted" to the right, becoming 10101, thus 21.
为了便于阅读,它用于标记:阅读1 << 1
,1 << 2
,1 << 3
比1
,2
,{{1}更容易}。