移位操作的优先级不清楚

时间:2019-06-27 18:20:42

标签: php bit bit-shift operator-precedence

我一直在用PHP中的shift运算符苦苦挣扎,假设它先于+,1等算术运算。我一直无法在php手册中找到任何对此的定义。

假设我有一个值1,我想要3,然后是7,依此类推,从右边(LSB)填充位。

我尝试过:

$X = 1;

然后,在循环中:

$X <<= 1 + 1; // returns 4 instead of 3.
$X <<= 1 + 1; // returns 16 instead of 7.

因此,显然在移位之前已计算1 + 1。 我的解决方案:

$X = 1;
$X <<= 1; // $X=2
$X += 1;  // $X=3 as expected
$X <<= 1; // $X=6
$X += 1;  // $X=7 as expected

哪个比较笨拙,但这会返回正确的数字。第一种方法不应该产生正确的结果,先移位然后进行算术运算吗?

3 个答案:

答案 0 :(得分:2)

$X <<= 1 + 1

转换为:

$X = $X << (1 + 1)

如果您想以其他方式进行操作,则可以使用:

$X = ($X << 1) + 1

答案 1 :(得分:0)

请参阅Operator Precedence表和说明。 +运算符的优先级高于<<=。您可以通过用括号()分组来强制优先级:

$X = ($X <<= 1) + 1;

还请注意:

  

即使不是绝对必要,使用括号也可以通过使分组显式而不是依靠隐式运算符优先级和关联性来提高代码的可读性。

答案 2 :(得分:0)

感谢您的评论! 实际上,“ << =”不仅是运算符,还是赋值,所以

$X <<= 1 + 1 will be interpreted as $X <<= 2.
$X = $X << 1 + 1 might possibly work (I haven't checked), but
$X = ($X << 1) + 1 as suggested by Ilya would be the right way.