Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: PHP: альтернатива для поразрядных операций с 64-битными целыми
 
 автор: JIEXA   (17.10.2011 в 19:20)   письмо автору
 
 

Здравствуйте!
Скажите, пожалуйста, как подобный код можно реализовать на PHP?

num1 = 54
num2 = 32
filter_val = (uint64(num1))<<num2 | 2


Знаю, что у PHP проблемы с 64-битными числами. Как это можно обойти?

  Ответить  
 
 автор: cheops   (17.10.2011 в 20:17)   письмо автору
 
   для: JIEXA   (17.10.2011 в 19:20)
 

Вот этот участок
num1 = 54 
num2 = 32
(uint64(num1))<<num2
эквивалентен следующему
<?php
  
echo 54 pow(232);
?>
Не понятно только зачем | 2, при таких числах там все равно нули... т.е. фактически можно просто прибавить 2 к числу.
<?php
  
echo 54 pow(232) + 2;
?>

  Ответить  
 
 автор: Долохов   (17.10.2011 в 22:14)   письмо автору
 
   для: cheops   (17.10.2011 в 20:17)
 

> эквивалентен следующему
> echo 54 + pow(2, 32);
Это неверно.

  Ответить  
 
 автор: cheops   (18.10.2011 в 09:18)   письмо автору
 
   для: Долохов   (17.10.2011 в 22:14)
 

Подход верен, а точный эквивалент нужно смотреть самостоятельно с калькулятором в руках - поправку на минус нужно делать (её здесь нет, так как у меня нет под рукой 64-битных целых). Другое дело, какова цель этих вычислений, если потом такое число используется в качестве битовой маски, то полученная таким образом битовая маска может не подойти в силу того, что результатом является double, которое не во всех системах 64 бита, кое-где и 80 встречается, да и его битовая организация отличается от целого.

  Ответить  
 
 автор: Долохов   (18.10.2011 в 13:53)   письмо автору
 
   для: cheops   (18.10.2011 в 09:18)
 

Нет, подход как раз неверен.

10 << 5 != (1 << 5) + 10.

  Ответить  
 
 автор: cheops   (18.10.2011 в 15:14)   письмо автору
 
   для: Долохов   (18.10.2011 в 13:53)
 

Ну да, согласен (за минусом того, что вы оперируете десятичным основанием, а нужно двоичным), плюс конечно же нужно заменить на умножение
<?php
  
echo (10 << 5);
  echo 
"<br>";
  echo 
10 pow(25);
?>
Соответсвенно приведенный выше код нужно интерперетировать как
<?php 
  
echo 54 pow(232) + 2
?>

  Ответить  
 
 автор: JIEXA   (18.10.2011 в 16:27)   письмо автору
 
   для: cheops   (18.10.2011 в 15:14)
 

Спасибо за решение.
Насчет цифры 2, это просто я не совсем верный изначальный код дал.
Вот правильный:

num1 = 54 
num2 = 2
filter_val = (uint64(num1))<<32| num2


Насколько я понимаю, решение будет таким?

 echo 54 * pow(32, 2) +32;

  Ответить  
 
 автор: cheops   (18.10.2011 в 17:29)   письмо автору
 
   для: JIEXA   (18.10.2011 в 16:27)
 

Совершенно верно, но лучше, конечно, проверить это через C-программу, которая позволяет оперировать произвольным полем бит, а не ограничена 32-мя. Меня если честно все-равно беспокоит бит для минуса, особенно, если num1 будет меньше 32-х.

  Ответить  
 
 автор: Долохов   (19.10.2011 в 00:17)   письмо автору
 
   для: JIEXA   (18.10.2011 в 16:27)
 

> Насколько я понимаю, решение будет таким?
> echo 54 * pow(32, 2) +32;
Это неверно.

  Ответить  
 
 автор: Саня   (17.10.2011 в 20:55)   письмо автору
 
   для: JIEXA   (17.10.2011 в 19:20)
 

У РНР нет проблем с 64-битными числами, если он скомпилирован на 64-битной машине (или на машине с PAE).

Обойти можно при помощи GMP или bcmath.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования