Побитовое И не работает для определённых чисел

J-Pro

Новичок
Побитовое И не работает для определённых чисел

Добрый день всем.

По форуму смотрел, вроде похожей проблемы не нашёл.

Вопрос в следующем: необходимо проверить имеется ли ключ
100000000000000000000000000000000000000 в
111111111111111111111111111111111111111.
Естественно, что мы для этого делаем? Побитовое И. Первое число - это 274877906944, второе же 549755813887. То есть, необходимо проверить, если 549755813887 & 274877906944 равно 274877906944. Если равно, то ключ имеется, если нет - то нет. Вроде, правильно.

Пишу в пхп и результатом операции 549755813887 & 274877906944 получаю 0. Результатом же операции 549755813887 & 32 получаю 32. В чём может быть проблема?

Записи идентичны, в чём же трабла?
PHP:
echo "result = " . (549755813887 & 274877906944 );
echo "result = " . (549755813887 & 32);
В мануале написано про максимальное число для сдвига, неужели и тут лимит?

Спасибо заранее за ответ.
 

Gorynych

Посетитель PHP-Клуба
посмотрите на результат вывода:
PHP:
echo sprintf("%b\n%b\n%b\n%d\n", 549755813887, 274877906944, 1 << 31, 1 << 31);
 

hermit_refined

Отшельник
+
PHP:
var_dump(549755813887);
Побитовые операции для вещественных чисел - это что-то очень необычное.
 

J-Pro

Новичок
Спасибо вам за ответы.

hermit_refined, необычно выглядит, а в целом - одно и то же.

Результат:
PHP:
sprintf: 11111111111111111111111111111111 0 10000000000000000000000000000000 -2147483648 

var dump: float(549755813887)
 

Gorynych

Посетитель PHP-Клуба
необычно выглядит, а в целом - одно и то же
ну это только с точки зрения, что лежит где-то непосредственно в регистрах и непосредственно там выполняются побитовые операции
 

SiMM

Новичок
> Результат: sprintf: 11111111111111111111111111111111 0 10000000000000000000000000000000 -2147483648
549755813887 = 0x7F FFFF FFFF - не влезает в 32хбитную арифметику.
 

J-Pro

Новичок
Автор оригинала: SiMM
> Результат: sprintf: 11111111111111111111111111111111 0 10000000000000000000000000000000 -2147483648
549755813887 = 0x7F FFFF FFFF - не влезает в 32хбитную арифметику.
И что, единственное решение делить эти флаги на два? Это наименее оптимальное решение :(

И всё же, можно ли как-то обойтись с теми же флагами?

Спасибо ещё раз за помощь.
 

SiMM

Новичок
> И что, единственное решение делить эти флаги на два? Это наименее оптимальное решение
Понятие "оптимальное" в программировании может иметь более одного значения.

> И всё же, можно ли как-то обойтись с теми же флагами?
Числа в каком диапазоне Вы собираетесь использовать?

> эту библиотеку ещё и собирать надо? А готовой длл-ки для пхп нет?
Есть. Идёт в комплекте с PHP. По крайней мере - начиная с 5.1.2.
 

J-Pro

Новичок
Автор оригинала: hermit_refined
Да как угодно. Чем строки из нулей и единиц не нравятся?
И как осуществлять побитовые операции со строками?

Автор оригинала: SiMM
> И всё же, можно ли как-то обойтись с теми же флагами?
Числа в каком диапазоне Вы собираетесь использовать?
Вот 549755813887 - максимальное...

Автор оригинала: SiMM
> эту библиотеку ещё и собирать надо? А готовой длл-ки для пхп нет?
Есть. Идёт в комплекте с PHP. По крайней мере - начиная с 5.1.2.
Хмм... ща гляну, может, подойдёт... пасиб

-~{}~ 02.11.06 16:36:

С библиотекой GMP работает, разобрался, вроде...

Сделал небольшую ф-цию, в которую нужно передавать переменные в виде строк и всё будет работать. А то громоздко со всеми этими преобразованиями... Может, кому пригодится...

Да... не забудьте в php.ini добавить строчку extension=php_gmp.dll, рядом со строчкой extension=php_mysqli.dll.


PHP:
    public function bitwiseAND($variable, $key)
    {
        $gmpVar = gmp_init($variable);
        $gmpKey = gmp_init($key);

        $gmpResultAsResourse = gmp_and($gmpVar, $gmpKey);

        return gmp_strval($gmpResultAsResourse);
    }
 
Сверху