任何人都可以解释这种按位运算语法吗?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
我知道它设置了 的位var
,但我无法理解语法。
任何人都可以解释这种按位运算语法吗?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
我知道它设置了 的位var
,但我无法理解语法。
让我们逐个分解:
1UL
是unsigned long int
一个值为 1 的位级别表示为:
00000000000000000000000000000001
这<<
是一个“位移”运算符,它将将该值中的所有位向左移动bitno
次数。如果是1UL<<5
,你最终会得到:
00000000000000000000000000100000
一旦你有了这个值,|=
(这是一个带有赋值的按位或运算var
)将基本上强制与它一致的位1
为 a1
并且不会触及任何其他位,因为 ( X | 0 = X
)
可以说var
是37
和bitno
是7
。然后位级别的所有内容将如下所示:
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
最后,如果不清楚,#define
标记Bitset
为类似函数的宏。
这是一个宏。每当预处理器遇到一个像Bitset(var,bitno)
它一样的语句时,它都会忠实地将其替换为
var = var | 1UL << (bitno)
进一步解释这一点。
UL这里的意思是Unsigned Long。
运算符|
用于bitwise OR
操作。所以变量var
被OR
编辑
1UL << bitno
并分配回var
然后在运行时或编译时取决于程序的性质,
说var
是01000110
和bitno
是5
然后1UL << 5 = 32
或00100000
然后
var = 01000110 | 00100000
IEvar = 01100110
说 var=8,即0000 1000
二进制。
如果你这样做
8 | 16
您将拥有0000 1000 | 0001 0000
which 会给您0001 1000
,因为|
如果任一位为 1,则操作员会设置该位。
因此,您将|
运算符应用于您的值1<<n
,即0000 0001
向左移动 n 位。
例如1 << 3
是0000 0001 << 2 = 0000 0100
.
本质上:doingBitset(8,3)
将生成一个掩码,其中只有第三位通过doing 1 << 3
、getting设置0000 0100
。然后它会将这个掩码“或”为 8,给出: 0000 1000 | 0000 0100
,结果是0000 1100
,也就是说,你设置了 8 的第 3 位。