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
让我们一块一块地分解它:
1UL是unsigned 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)
可以说,var是37和bitno是7.然后位级别的所有内容将如下所示:
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
Run Code Online (Sandbox Code Playgroud)
最后,如果不清楚,#define标记Bitset就像一个类似函数的宏.
这是一个宏。每当预处理器遇到一条语句时,Bitset(var,bitno)它就会忠实地将其替换为
var = var | 1UL << (bitno)
Run Code Online (Sandbox Code Playgroud)
对此进一步说明。
UL这里的意思是Unsigned Long。
操作符|用于bitwise OR操作。所以变量var被OR编辑
1UL << bitno并分配回var
然后在运行时或编译时取决于程序的性质,
说var是01000110
并且bitno是5
那么1UL << 5 = 32或者00100000
然后
var = 01000110 | 00100000
Run Code Online (Sandbox Code Playgroud)
IEvar = 01100110