【问题标题】:Bitwise & | operators in octal system按位和 |八进制运算符
【发布时间】:2018-12-02 01:54:11
【问题描述】:

我了解按位运算符 &| 如何处理二进制数。但是,我对它们如何处理八进制数感到困惑。

系统是否先将数字转换为二进制,然后执行操作,然后再转换回八进制?还是可变的?

例如,如果我执行以下任一操作:

echo decoct( 0400 & 0500 | 0000 );
echo decoct( 0600 & 0500 | 0000 );

我得到400 作为结果。

但是,如果我这样做:

echo decoct( 0400 & 0500 | 0100 );
echo decoct( 0600 & 0500 | 0100 );

在这两种情况下我都会得到500

另外,我还看到了 PHP 中的按位运算没有使用 decoct 的代码。 PHP 是否在操作完成后将其保留为八进制?或将其转换为十进制(什么时候这样做?)。

请引导我正确地学习和学习理解八进制(以及十进制和其他)按位运算的方向。

【问题讨论】:

    标签: php bitwise-operators


    【解决方案1】:

    位运算符“幸运地”适用于您的值/变量的二进制、八进制和十六进制表示。最后,它们都将在您的值/变量的二进制级别上运行。您的数字/位分组完全符合位运算符。

      0400 = 0b100000000 = 0x100 (0001 0000 0000)
    & 0500 = 0b101000000 = 0x140 (0001 0100 0000)
    ----------------------------
      0400 = 0b100000000 = 0x100 (0001 0000 0000)
    | 0100 = 0b001000000 = 0x040 (0000 0100 0000)
    ----------------------------
      0500 = 0b101000000 = 0x140 (0001 0100 0000)
    

    对于另一个表达式:

      0600 = 0b110000000 = 0x180 (0001 1000 0000)
    & 0500 = 0b101000000 = 0x140 (0001 0100 0000)
    ----------------------------
      0400 = 0b100000000 = 0x100 (0001 0000 0000)
    | 0100 = 0b001000000 = 0x040 (0000 0100 0000)
    ----------------------------
      0500 = 0b101000000 = 0x140 (0001 0100 0000)
    

    它确实适用于这些表示,因为“数字”将始终使用 1、3 或 4 位,并且没有其他“数字”可以覆盖这些“保留”数字。

    按位运算在值的位上运行(因此得名)。值的表示/显示与按位运算无关。

    【讨论】:

    • 感谢您的精彩解释。您能否解释一下问题的另一部分,即 php 是如何知道我们在那里处理 oct 或 dec 数字以及为什么有些脚本 dnt 也使用 decoct 的?
    • @NabeelKhan 变量的表示不会改变变量的值。当您使用前缀 0 表示 oct 和 0x 表示十六进制数时,PHP 知道您何时处理 oct 或 dec 数字。如果你想使用dechex(),这样的方法取决于你想如何打印或读取字符串/数字,但它对按位运算没有影响。
    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2011-06-20
    • 2012-09-25
    • 2013-11-26
    • 2020-09-25
    相关资源
    最近更新 更多