Ansi C中的位设置

tco*_*cop 13 c bit-manipulation ansi bit-shift bitwise-operators

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

#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
Run Code Online (Sandbox Code Playgroud)

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

Fog*_*zie 22

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

1ULunsigned long int位为1的值,表示为:

00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)

<<是一个"位移"运算符,它将该值中的所有位移到左侧bitno的次数.如果是的话1UL<<5,你最终会得到:

00000000000000000000000000100000
Run Code Online (Sandbox Code Playgroud)

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

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

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

00000000000000000000000010100101  // var | (1UL<<7)
Run Code Online (Sandbox Code Playgroud)

最后,如果不清楚,#define标记Bitset就像一个类似函数的宏.


sr0*_*853 5

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

var = var | 1UL << (bitno)
Run Code Online (Sandbox Code Playgroud)

对此进一步说明。

UL这里的意思是Unsigned Long

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

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

var01000110 并且bitno5

那么1UL << 5 = 32或者00100000

然后

var = 01000110 | 00100000 
Run Code Online (Sandbox Code Playgroud)

IEvar = 01100110