Ansi C中的位设置

时间:2013-01-22 20:11:53

标签: c ansi

任何人都可以解释以下语法吗?

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

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

3 个答案:

答案 0 :(得分:17)

让我们一点一点地分解它:

1UL是一个unsigned long int,其值为1,表示为位:

00000000000000000000000000000001

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

00000000000000000000000000100000

获得此值后,|=(带有作业的bitwise OR operation)实际上会强制var1一致的位是1并且不会触及任何其他位,因为(X | 0 = X

让我们说var37bitno7。那么位级别的所有内容都将如下所示:

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

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

最后,如果不清楚,#defineBitset标记为function-like macro

答案 1 :(得分:3)

这是一个宏。每当预处理器点击Bitset(var,bitno)之类的语句时,它就会忠实地用

替换它
var = var | 1UL << (bitno)

进一步解释这一点。

UL 此处表示无符号长

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

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

var01000110 bitno5

然后1UL << 5 = 3200100000

然后

var = 01000110 | 00100000 

var = 01100110

答案 2 :(得分:1)

说var = 8,二进制是0000 1000

如果你这样做

8 | 16您将0000 1000 | 0001 00000001 1000,因为|运算符会设置该位,如果该位为1。

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

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

实质上:执行Bitset(8,3)将生成一个掩码,只需设置第三位,即1 << 3,获取0000 0100。 然后它将“或”此掩码设为8,给出:0000 1000 | 0000 0100,结果为0000 1100,即设置第3位为8。

相关问题