Использование битовых операций над 64-битными целыми числами в 32-битных системах (без расширения php_gpm) - PullRequest
3 голосов
/ 06 декабря 2010

Я нашел какое-то решение Эффективный способ выполнения 64-битного поворота с использованием 32-битных значений , но его нет в PHP.

Самая большая проблема заключается в том, что с удаленного сервера я получаю большое целое число 9223372036854775808(10) как hexadecimal 8000000000000000(16).

Нет возможности включить php_gmp (extension) на рабочем сервере, но я должен проверить выбранные биты в полученном значении. Сервер производства и разработки 32bits machines.

1 Ответ

1 голос
/ 06 июля 2012

Вы можете сделать это, используя BC Math (Произвольная математика точности):

BC Math позволяет выполнять математические операции над числами. Разница между использованием арифметических операторов и использованием математики BC заключается в том, что вместо сохранения числа в виде целого числа или числа с плавающей запятой математика BC возвращает число в виде строки.

http://php.net/manual/en/ref.bc.php

PHP должен быть скомпилирован с BC Math; однако большинство установок PHP должно иметь это.

К сожалению, вы не можете выполнять побитовые операции со строками, и BC Math не имеет встроенных побитовых функций. Тем не мение; после небольшого поиска в Google, я нашел следующий пример кода, скопировал и вставил его ниже:

function bitValue($no) { return bcpow(2, $no); }
function bitSet($no, $value) {
    $tmp = bcmod($value, bitValue($no+1));
    return bccomp(bcsub($tmp, bitValue($no)), 0)>= 0;
}

echo bitSet(49, bitValue(48)) ."\n";
echo bitSet(48, bitValue(48)) ."\n";
echo bitSet(47, bitValue(48)) ."\n";

(Кредит Hernst42)

...