【问题标题】:Unclear precedence of bitshift operation移位操作的优先级不明确
【发布时间】:2019-06-27 18:20:42
【问题描述】:

我一直在努力使用 PHP 中的移位运算符,假设它先于 +、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

这有点笨拙,但这会返回正确的数字。第一种方法不应该产生正确的结果,先移位然后做算术吗?

【问题讨论】:

标签: php bit bit-shift operator-precedence


【解决方案1】:

$X &lt;&lt;= 1 + 1

转换成:

$X = $X &lt;&lt; (1 + 1)

如果你想以不同的方式做,那么你可以使用:

$X = ($X &lt;&lt; 1) + 1

【讨论】:

    【解决方案2】:

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

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

    另请注意:

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

    【讨论】:

    • 对于短赋值形式,+ 的更高优先级无关紧要($x = 2;$x *= 2+3; 会返回什么?,另外 - 双重赋值没有意义
    • 你在说什么WTF?这显然返回 10,因为 + 的优先级高于 *=
    • 我在谈论关联性,像a op= b 这样的运算符以右关联性执行,这基本上意味着它们被视为a = a op (b) 这就是为什么优先级在这里无关紧要的原因,@987654332 @ 不适用于 op
    • 关联性仅在优先级相同时适用,所以是的,优先级在这里很重要,因为优先级不同。
    【解决方案3】:

    感谢您的 cmets! 其实'

    $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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多