有人能解释一下这种按位操作语法吗?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
我知道它设置了var的位,但我不理解语法。
var
pdkcd3nj1#
让我们一点一点来分析:1UL是值为1的unsigned long int,在位级表示为:
1UL
unsigned long int
00000000000000000000000000000001
<<是一个“位移位”运算符,它会将该值中的所有位向左移动bitno次。如果它是1UL<<5,你将得到:
<<
bitno
1UL<<5
00000000000000000000000000100000
一旦你有了这个值,|=(这是一个带有赋值的按位OR操作)将基本上强制var中与1一致的位成为1,并且不会触及任何其他位,因为(X | 0 = X)假设var是37,bitno是7。那么比特级的所有内容都将如下所示:
|=
1
X | 0 = X
37
7
00000000000000000000000000100101 // var 00000000000000000000000010000000 // 1UL<<7 00000000000000000000000010100101 // var | (1UL<<7)
最后,如果不清楚,#define将Bitset标记为类似函数的宏。
#define
Bitset
wpx232ag2#
这是一个宏。每当预处理器遇到像Bitset(var,bitno)这样的语句时,它都会忠实地将其替换为
Bitset(var,bitno)
var = var | 1UL << (bitno)
进一步解释这一点。这里的UL表示无符号长。运算符|用于bitwise OR运算。因此变量var是OR与1UL << bitno的乘积,并赋值回var。然后在运行时或编译时期间取决于程序的性质,假设var是01000110,bitno是5则1UL << 5 = 32或00100000然后
|
bitwise OR
OR
1UL << bitno
01000110
5
1UL << 5 = 32
00100000
var = 01000110 | 00100000
即var = 01100110
var = 01100110
g6ll5ycj3#
假设var=8,即二进制中的0000 1000。如果你做了8 | 16你将得到0000 1000 | 0001 0000,它将给予你0001 1000,因为|运算符在任何一位为1时设置该位。因此,您将|运算符应用于您的值和1<<n,即向左移动n位的0000 0001。例如1 << 3是0000 0001 << 2 = 0000 0100。本质上:执行Bitset(8,3)将生成一个掩码,通过执行1 << 3只设置了第三位,得到0000 0100。然后将这个掩码“或”为8,给出:0000 1000 | 0000 0100,结果为0000 1100,即您将第3位设置为8。
0000 1000
8 | 16
0000 1000 | 0001 0000
0001 1000
1<<n
0000 0001
1 << 3
0000 0001 << 2 = 0000 0100
Bitset(8,3)
0000 0100
0000 1000 | 0000 0100
0000 1100
3条答案
按热度按时间pdkcd3nj1#
让我们一点一点来分析:
1UL
是值为1的unsigned long int
,在位级表示为:<<
是一个“位移位”运算符,它会将该值中的所有位向左移动bitno
次。如果它是1UL<<5
,你将得到:一旦你有了这个值,
|=
(这是一个带有赋值的按位OR操作)将基本上强制var
中与1
一致的位成为1
,并且不会触及任何其他位,因为(X | 0 = X
)假设
var
是37
,bitno
是7
。那么比特级的所有内容都将如下所示:最后,如果不清楚,
#define
将Bitset
标记为类似函数的宏。wpx232ag2#
这是一个宏。每当预处理器遇到像
Bitset(var,bitno)
这样的语句时,它都会忠实地将其替换为进一步解释这一点。
这里的UL表示无符号长。
运算符
|
用于bitwise OR
运算。因此变量var
是OR
与1UL << bitno
的乘积,并赋值回var
。然后在运行时或编译时期间取决于程序的性质,
假设
var
是01000110
,bitno
是5
则
1UL << 5 = 32
或00100000
然后
即
var = 01100110
g6ll5ycj3#
假设var=8,即二进制中的
0000 1000
。如果你做了
8 | 16
你将得到0000 1000 | 0001 0000
,它将给予你0001 1000
,因为|
运算符在任何一位为1时设置该位。因此,您将
|
运算符应用于您的值和1<<n
,即向左移动n位的0000 0001
。例如
1 << 3
是0000 0001 << 2 = 0000 0100
。本质上:执行
Bitset(8,3)
将生成一个掩码,通过执行1 << 3
只设置了第三位,得到0000 0100
。然后将这个掩码“或”为8,给出:0000 1000 | 0000 0100
,结果为0000 1100
,即您将第3位设置为8。