2

我是位运算的初学者(在 C 方面也不是很有经验),我遇到了以下表达式:

x |= (1<<y)

起初我以为它的意思是“x 等于 x 或 y 左移一位”,但后来我意识到这将是:

x |= (y<<1)

最后,我认为它的意思是“x 等于 x 或 1 左移 y 位”,但我不明白 1 在 8 位寄存器中的位置,是 00000001 吗?以便:

a = 2
b = 1<<a // so b=00000010

谁能告诉我这句话的正确含义。另外,如果有人有一个很好的链接来解释按位语法,我将不胜感激。谢谢。


x |= ...

是简写

x = x | ...

它将值分配x | ...x

1 << y

1左移y. _ 例如

00000001 << 1 -> 00000010

所以,

x |= (1 << y)

左移OR x并将结果分配给)。1yx
换句话说,它将第y位设置x1

x = 01010101
x |= (1 << 1)   -> 01010111  (it set the 2nd bit to 1)
4

2 回答 2

2
x |= ...

是简写

x = x | ...

它将值分配x | ...x

1 << y

1左移y. _ 例如

00000001 << 1 -> 00000010

所以,

x |= (1 << y)

左移OR x并将结果分配给)。1yx
换句话说,它将第y位设置x1

x = 01010101
x |= (1 << 1)   -> 01010111  (it set the 2nd bit to 1)
于 2013-02-16T19:37:31.273 回答
1

第一条语句意味着将 1 (0b0000001) 的二进制表示左移 y 位。然后将值与 X 进行或运算。第二个语句的假设是正确的。第三条语句将产生 4 (0b0000000100)。就位操作语义而言,C 标准定义了所有要表示的位操作,以便二进制数以 2 的幂的递增值从右到左读取。您无需担心字节顺序或两个补码等,编译器将处理为你。所以 (0b00100) = 4, (0b000010) = 2, (0b00001) = 1, 以此类推。

于 2013-02-16T19:46:35.803 回答