【问题标题】:Correct binary representation for PHP_INT_MAX + 1 with whom make bitwise operations in PHP?PHP_INT_MAX + 1 的正确二进制表示与谁在 PHP 中进行按位运算?
【发布时间】:2014-11-09 20:00:48
【问题描述】:

根据这篇文章-> How to get binary representation of floating-point number in PHP?

函数 floatToBinStr($value) 用于在 PHP 中以二进制形式表示浮点数/双精度数。 如果我用这个参数调用它:

floatToBinStr(PHP_INT_MAX + 1);

我得到了这个二进制表示:

0100001111100000000000000000000000000000000000000000000000000000

64 位,最左边的位是第 63 位,因为第 64 位用于负浮点数,所以一切正常。

我有一个函数,它返回最左边位的位置,给定一个数字作为参数,我注意到如果我传递大于 PHP_INT_MAX 的值(例如)

 public function getPositionOfLeftMostBitSetTo1($n) {
    $masks = array(0x1, 0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000, 0xFFFFFFFF00000000);
    $positions = array(1, 2, 2, 4, 8, 16, 32);
    $r = ($n < 0) ? -1 : 0);
    for ($i = PHP_INT_SIZE == 8 ? 6 : 5; $i >= 0; $i--)
    {
      if ($n & $masks[$i]) {
            $n >>= $positions[$i];
            $r += $positions[$i];
        }
    }
    return $r;
 }
 echo getPositionOfLeftMostBitSetTo1(PHP_INT_MAX + 1);

我得到 65 作为输出。如果我试试这个:

echo decbin(PHP_INT_MAX + 1); // PHP_INT_MAX + 1 = 9.22337203685E+18

我明白了

1000000000000000000000000000000000000000000000000000000000000000

所以看起来最左边的位是第 64 位,尽管这是错误的,因为这不是负浮点数,而且我的函数没有正确返回而是返回 65,因为它的行为就像是右移在负整数上...

如何让 PHP 识别大于 PHP_INT_MAX 的浮点数/双精度值,并对其执行安全的按位运算?

感谢关注!

【问题讨论】:

    标签: php floating-point double bit-manipulation shift


    【解决方案1】:

    我通过使用 floatToBinStr($value) 函数将浮点数转换为二进制来解决,然后我使用 bindec 将该二进制表示转换为一个整数,我可以毫无问题地在该整数上转换,最终达到 getPositionOfLeftMostBitSetTo1() 的目的是将最左边的位的位置设置为 1,仅此而已,因此将二进制浮点数转换为可以完成工作的任何整数。

    【讨论】:

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