Press "Enter" to skip to content

二进制直接量(binary number format)

从PHP5.4开始, 我们可以直接在代码中书写二进制直接量了. 这个在定义一些标志位的时候, 尤为方便.
看下面的例子:

$bin  = 0b1101;
echo $bin;
//13

而在以前, 我们需要使用bin2dec来用字符串表示, 这个着实有些不爽.
另外, PHP5.4还新增了hex2bin 可以直接把一个十六进制表示的字符串, 转换成二进制数据流, 而在以前, 我们需要使用pack来完成.

<?php
$hex = "ff0f";
var_dump(hex2bin($hex) === pack("H*", $hex));
//bool(true);

不过, 还是要提醒下: PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.
谢谢
更多更新信息, 请关注: Changelog

10 Comments

  1. ChetJuicy
    ChetJuicy July 8, 2018

    I often visit your blog and have noticed that you don’t update
    it often. More frequent updates will give your website higher rank & authority in google.
    I know that writing content takes a lot of time, but you
    can always help yourself with miftolo’s tools which will shorten the
    time of creating an article to a few seconds.

  2. iminto
    iminto December 10, 2011

    java7里的新特性

  3. wynn
    wynn October 10, 2011

    @wclssdn: 请认真看一下PHP文档,在type的integer那一部分有很明确的描述:
    整数溢出
    如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
    以及对应的范例代码:
    <?php
    $large_number = 2147483647;
    var_dump($large_number);
    // 输出为:int(2147483647)
    $large_number = 2147483648;
    var_dump($large_number);
    // 输出为:float(2147483648)
    你可以自己试试看 var_dump(pow(2,64), pow(2, 64)-1); 看看结果是什么(尤其请注意看类型)。
    32位机器上,float拥有14位精度,而pow(2,64)是10^19量级了。
    要对大整数进行处理可以用GMP或者BCMath

  4. wclssdn
    wclssdn October 10, 2011

    2^64 是浮点数?
    那你用18446744073709551616这个数..
    if (18446744073709551616 == 18446744073709551615){
    echo ‘x’;
    }
    试试.. 你就知道我说的啥意思了- -..

  5. vt
    vt October 10, 2011

    @wclssdn 这不是整数,这是浮点数啊

  6. wclssdn
    wclssdn October 10, 2011

    @vt 你尝试用2^64这个数试试… 前提是32位机器上.
    我不想计算小数… 我是想说.. PHP在大整数的处理上..有点问题..

  7. vt
    vt October 10, 2011

    再试一次
    function compare_float($f1, $f2, $precision=0.00001) {
    if (abs($f1-$f2) < $precision) {
    return 1; // equal
    }
    else {
    return 0; // not equal
    }
    }

  8. vt
    vt October 10, 2011

    @wclssdn PHP 有浮点类型的,你说的这个问题和 PHP 没关系。如果你想比较浮点数可以用这种办法:
    function compare_float($f1, $f2) {
    $precision = 0.00001;
    if ((($f1 – $precision) f2))
    return 1;
    else
    return 0;
    }

  9. wclssdn
    wclssdn October 10, 2011

    内个… PHP中有double类型么?
    pow(2,64) == pow(2,64) – 1 的问题. 很恶心啊..
    话说. 这是32位机器上的效果..

Comments are closed.