任何人都可以解释以下语法吗?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
我知道它会设置var
的位,但我无法理解语法。
答案 0 :(得分:17)
让我们一点一点地分解它:
1UL
是一个unsigned long int
,其值为1,表示为位:
00000000000000000000000000000001
<<
是一个“位移”运算符,它将该值中的所有位向上移动到左bitno
次。如果是1UL<<5
,您最终会得到:
00000000000000000000000000100000
获得此值后,|=
(带有作业的bitwise OR operation)实际上会强制var
与1
一致的位是1
并且不会触及任何其他位,因为(X | 0 = X
)
让我们说var
是37
而bitno
是7
。那么位级别的所有内容都将如下所示:
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
最后,如果不清楚,#define
将Bitset
标记为function-like macro。
答案 1 :(得分:3)
这是一个宏。每当预处理器点击Bitset(var,bitno)
之类的语句时,它就会忠实地用
var = var | 1UL << (bitno)
进一步解释这一点。
UL 此处表示无符号长。
运算符|
用于bitwise OR
操作。所以变量var
是OR
ed
1UL << bitno
并分配回var
然后在运行时或编译时间期间,具体取决于程序的性质,
说var
为01000110
bitno
是5
然后1UL << 5 = 32
或00100000
然后
var = 01000110 | 00100000
即var = 01100110
答案 2 :(得分:1)
说var = 8,二进制是0000 1000
。
如果你这样做
8 | 16
您将0000 1000 | 0001 0000
将0001 1000
,因为|
运算符会设置该位,如果该位为1。
因此,您要将|
运算符应用于您的值1<<n
,即0000 0001
向左移位n位。
例如1 << 3
是0000 0001 << 2 = 0000 0100
。
实质上:执行Bitset(8,3)
将生成一个掩码,只需设置第三位,即1 << 3
,获取0000 0100
。
然后它将“或”此掩码设为8,给出:0000 1000 | 0000 0100
,结果为0000 1100
,即设置第3位为8。