Ansi C中的位设置和位移位

ikfrs5lh  于 2023-03-29  发布在  其他
关注(0)|答案(3)|浏览(157)

有人能解释一下这种按位操作语法吗?

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

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

pdkcd3nj

pdkcd3nj1#

让我们一点一点来分析:
1UL是值为1的unsigned long int,在位级表示为:

00000000000000000000000000000001

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

00000000000000000000000000100000

一旦你有了这个值,|=(这是一个带有赋值的按位OR操作)将基本上强制var中与1一致的位成为1,并且不会触及任何其他位,因为(X | 0 = X
假设var37bitno7。那么比特级的所有内容都将如下所示:

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

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

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

wpx232ag

wpx232ag2#

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

var = var | 1UL << (bitno)

进一步解释这一点。
这里的UL表示无符号长
运算符|用于bitwise OR运算。因此变量varOR1UL << bitno的乘积,并赋值回var
然后在运行时编译时期间取决于程序的性质,
假设var01000110bitno5
1UL << 5 = 3200100000
然后

var = 01000110 | 00100000

var = 01100110

g6ll5ycj

g6ll5ycj3#

假设var=8,即二进制中的0000 1000
如果你做了
8 | 16你将得到0000 1000 | 0001 0000,它将给予你0001 1000,因为|运算符在任何一位为1时设置该位。
因此,您将|运算符应用于您的值和1<<n,即向左移动n位的0000 0001
例如1 << 30000 0001 << 2 = 0000 0100
本质上:执行Bitset(8,3)将生成一个掩码,通过执行1 << 3只设置了第三位,得到0000 0100。然后将这个掩码“或”为8,给出:0000 1000 | 0000 0100,结果为0000 1100,即您将第3位设置为8。

相关问题