17

任何人都可以解释这种按位运算语法吗?

#define Bitset(var,bitno) ((var) |=1UL<<(bitno))

我知道它设置了 的位var,但我无法理解语法。

4

3 回答 3

29

让我们逐个分解:

1ULunsigned long int一个值为 1 的位级别表示为:

00000000000000000000000000000001

<<是一个“位移”运算符,它将将该值中的所有位向左移动bitno次数。如果是1UL<<5,你最终会得到:

00000000000000000000000000100000

一旦你有了这个值,|=(这是一个带有赋值的按位或运算var)将基本上强制与它一致的位1为 a1并且不会触及任何其他位,因为 ( X | 0 = X)

可以说var37bitno7。然后位级别的所有内容将如下所示:

00000000000000000000000000100101  // var
00000000000000000000000010000000  // 1UL<<7

00000000000000000000000010100101  // var | (1UL<<7)

最后,如果不清楚,#define标记Bitset为类似函数的宏

于 2013-01-22T20:17:49.110 回答
5

这是一个宏。每当预处理器遇到一个像Bitset(var,bitno)它一样的语句时,它都会忠实地将其替换为

var = var | 1UL << (bitno)

进一步解释这一点。

UL这里的意思是Unsigned Long

运算符|用于bitwise OR操作。所以变量varOR编辑 1UL << bitno并分配回var

然后在运行时编译时取决于程序的性质,

var01000110bitno5

然后1UL << 5 = 3200100000

然后

var = 01000110 | 00100000 

IEvar = 01100110

于 2013-01-22T20:16:29.100 回答
1

说 var=8,即0000 1000二进制。

如果你这样做

8 | 16您将拥有0000 1000 | 0001 0000which 会给您0001 1000,因为|如果任一位为 1,则操作员会设置该位。

因此,您将|运算符应用于您的值1<<n,即0000 0001向左移动 n 位。

例如1 << 30000 0001 << 2 = 0000 0100.

本质上:doingBitset(8,3)将生成一个掩码,其中只有第三位通过doing 1 << 3、getting设置0000 0100。然后它会将这个掩码“或”为 8,给出: 0000 1000 | 0000 0100,结果是0000 1100,也就是说,你设置了 8 的第 3 位。

于 2013-01-22T20:17:24.190 回答