IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    PHP位运算

    mckee发表于 2015-07-26 15:02:35
    love 0

    数字在计算机中是以二进制存储的,位运算就是对二进制的位进行操作。它有如下多种操作:
    与(&)
    按位与运算,当两者都为1结果为1

    //00000011
    //00001000
    
    var_dump(
        3 & 8  //0
    );

    或(|)
    按位或运算,当有一者为1时结果为1
    //00000011
    //00001000
    
    var_dump(
        3 | 8  //11
    );

    非(~)
    按位取反,0变1,1变0
    //00000011 =》 11111100 =》10000100
    var_dump(
        ~ 3   //-4
    );

    异或(^)
    按位异或,当两者只有一个为1时则结果为1
    //0000 0011
    //0001 0000
    var_dump(
        3 ^ 8 // 11
    );

    左移(<<)
    $a << $b表示将$a中的位向左移动$b次;左移$b位时,左边$b位抛弃,右边$b位补0
    //0000 0011
    var_dump(
        3 << 1, // 6
        3 << 2 // 12
    );

    右移 (>>)
    $a >> $b 表示将$a中的位向右移动$b次 ;右移$b位时,右边$b位抛弃,左边$b位用符号位填充(也就是说如果数字原先是一个正数,则右移之后再最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1)
    //0000 0011 => 0000 0001
    //0000 0011 => 0000 0000
    //1000 0011 => 1111 1101(补码) =>  1111 1110 => 1000 0010
    var_dump(
        3 >> 1, //1
        3 >> 2, //0
        -3 >> 1 //-2
    );

    PHP 的 ini 设定 error_reporting 使用了按位的值, 提供了关闭某个位的例子:

    var_dump(
      PHP_VERSION,
      E_ALL,
      E_NOTICE,
      E_ERROR,
      E_RECOVERABLE_ERROR,
      E_ALL & ~E_NOTICE, //显示出E_NOTICE外所有错误
      E_ALL ^ E_NOTICE, //显示出E_NOTICE外所有错误
      E_ERROR | E_RECOVERABLE_ERROR //只显示错误和可恢复错误
    );
    
    //结果如下:
    string(6) "5.4.33"
    int(32767)
    int(8)
    int(1)
    int(4096)
    int(32759)
    int(32759)
    int(4097)

    注:
    计算机存储中负数用补码表示;正数的补码和反码一样;
    负数的补码是对它的原码(符号位除外)各位取反,并在未位加1而得到的(即在反码的基础上+1);
    负数的反码是对它的原码(符号位除外)各位取反而得到的;
    补码与原码互补,即它们之间的关系式为:补码=原码求反+1;原码=补码求反+1 



沪ICP备19023445号-2号
友情链接