|
|
|
| Здравствуйте!
Скажите, пожалуйста, как подобный код можно реализовать на PHP?
num1 = 54
num2 = 32
filter_val = (uint64(num1))<<num2 | 2
|
Знаю, что у PHP проблемы с 64-битными числами. Как это можно обойти? | |
|
|
|
|
|
|
|
для: JIEXA
(17.10.2011 в 19:20)
| | Вот этот участок
num1 = 54
num2 = 32
(uint64(num1))<<num2
| эквивалентен следующему
<?php
echo 54 + pow(2, 32);
?>
| Не понятно только зачем | 2, при таких числах там все равно нули... т.е. фактически можно просто прибавить 2 к числу.
<?php
echo 54 + pow(2, 32) + 2;
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(17.10.2011 в 20:17)
| | > эквивалентен следующему
> echo 54 + pow(2, 32);
Это неверно. | |
|
|
|
|
|
|
|
для: Долохов
(17.10.2011 в 22:14)
| | Подход верен, а точный эквивалент нужно смотреть самостоятельно с калькулятором в руках - поправку на минус нужно делать (её здесь нет, так как у меня нет под рукой 64-битных целых). Другое дело, какова цель этих вычислений, если потом такое число используется в качестве битовой маски, то полученная таким образом битовая маска может не подойти в силу того, что результатом является double, которое не во всех системах 64 бита, кое-где и 80 встречается, да и его битовая организация отличается от целого. | |
|
|
|
|
|
|
|
для: cheops
(18.10.2011 в 09:18)
| | Нет, подход как раз неверен.
10 << 5 != (1 << 5) + 10. | |
|
|
|
|
|
|
|
для: Долохов
(18.10.2011 в 13:53)
| | Ну да, согласен (за минусом того, что вы оперируете десятичным основанием, а нужно двоичным), плюс конечно же нужно заменить на умножение
<?php
echo (10 << 5);
echo "<br>";
echo 10 * pow(2, 5);
?>
| Соответсвенно приведенный выше код нужно интерперетировать как
<?php
echo 54 * pow(2, 32) + 2;
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(18.10.2011 в 15:14)
| | Спасибо за решение.
Насчет цифры 2, это просто я не совсем верный изначальный код дал.
Вот правильный:
num1 = 54
num2 = 2
filter_val = (uint64(num1))<<32| num2
|
Насколько я понимаю, решение будет таким?
echo 54 * pow(32, 2) +32;
|
| |
|
|
|
|
|
|
|
для: JIEXA
(18.10.2011 в 16:27)
| | Совершенно верно, но лучше, конечно, проверить это через C-программу, которая позволяет оперировать произвольным полем бит, а не ограничена 32-мя. Меня если честно все-равно беспокоит бит для минуса, особенно, если num1 будет меньше 32-х. | |
|
|
|
|
|
|
|
для: JIEXA
(18.10.2011 в 16:27)
| | > Насколько я понимаю, решение будет таким?
> echo 54 * pow(32, 2) +32;
Это неверно. | |
|
|
|
|
|
|
|
для: JIEXA
(17.10.2011 в 19:20)
| | У РНР нет проблем с 64-битными числами, если он скомпилирован на 64-битной машине (или на машине с PAE).
Обойти можно при помощи GMP или bcmath. | |
|
|
|