Использование битового сдвига GMP с отрицательными числами - PullRequest
0 голосов
/ 25 июля 2011
echo -1 >> 8; //returns -1

function gmp_shiftr($x,$n) { // shift right
  return(gmp_div($x,gmp_pow(2,$n)));
}

echo gmp_strval(gmp_shiftr(-1, 8)); //returns 0

Я пытаюсь получить те же возвращаемые значения, которые в противном случае я бы получил от побитовых операторов на 64-битной машине с функциями GMP, но он не делает этого для отрицательных чисел.

Iзадал довольно идентичный вопрос некоторое время назад, но эта тема полностью умерла.Верхний ответ в основном предлагал мне отредактировать код C, лежащий в основе PHP, но, поскольку я на управляемом хостинге, я не могу связываться с исходным кодом (не говоря уже об отсутствии переносимости в таком решении).

Я использую функции GMP, потому что мне нужно иметь дело с большими числами, на которых 32-битные системы не дают правильных результатов.Я также пытался использовать математические функции BC, но они имеют ту же проблему с отрицательными # s.

1 Ответ

0 голосов
/ 25 июля 2011

Ваша реализация правого сдвига неверна. Сдвиг вправо дает те же результаты, что и деление со степенью двойки, если результат не больше -1 для отрицательных чисел. Это ясно из примеров, приведенных в руководстве по PHP:

http://php.net/manual/en/language.operators.bitwise.php

Решением было бы проверить, является ли данный $ x отрицательным, но больше -2 ^ $ n, и, если это так, вернуть -1 напрямую.

...