PHP_INT_MAX+1的正确二进制表示形式,与他一起在PHP中进行按位操作


Correct binary representation for PHP_INT_MAX + 1 with whom make bitwise operations in PHP?

根据这篇文章->如何在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大的浮点/双精度,并安全地对其执行逐位操作?

感谢关注!

我通过floatToBinStr($value)函数将浮点转换为二进制来解决问题,然后我使用bindec将二进制表示转换为一个整数,在这个整数上我可以毫无问题地移动,最后getPositionOfLeftMostBitSetTo1()的目的是将最左边的位集的位置返回为1,而不是其他,因此,将二进制浮点值转换为任意整数就完成了任务。