任何人都可以解释这种按位运算语法吗?
#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 0000which 会给您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 位。