с плавающей запятой — правильное двоичное представление для PHP_INT_MAX + 1, с которым выполняются побитовые операции в 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, как они должны, и безопасно выполнять побитовые операции над ними?

Спасибо за внимание!

0

Решение

Я решил преобразовать число с плавающей запятой в двоичное с помощью функции floatToBinStr ($ value), а затем использовал bindec, чтобы преобразовать это двоичное представление в целое число, по которому я могу без проблем сдвигаться, в конце цель getPositionOfLeftMostBitSetTo1 () — вернуть позиция самого левого бита установлена ​​в единицу, больше ничего, поэтому преобразование этого двоичного числа с плавающей точкой в ​​любое целое число будет выполнено.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]