Опять Xor (Help)

Antava

Новичок
Опять Xor (Help)

Всем привет,
возникла проблема с обработкой больших чисел (свыше 32бит),
вот пример котрый уже был на форуме.

----------------------------------------------------------------------------------
вот пример, на выходе $a разные (-346250064 - верно, -2147441448 - нет)
PHP:
<? 
$a = -4641259416; 
$b = 42200; 
echo "\n<br>a: ".$a."<br>b: ".$b; 
$a^=$b; 
echo "\n<br>aa: ".$a;
?>
----------------------------------------------------------------------------------

Решил сперва перевести все числа в двоичную форму,
тоесть делю на два и так далее все складываю в массив, затем над каждым битом чисел провожу операцию,
но возникли две проблемы
1. мой результат расходится с правильным результатом.
2. отрицательное число не могу перевести в двоичную форму (перевожу но не правильно) с положительными все ок.

Огромная просьба показать пример или направить в нужное русло с решением этой проблемы.
Нужен обязательно правильный результат на любых системах.
Версии пхп на которых было испробовано 4.4.2 и 5.1.2

Заранне спасибо.
 

Antava

Новичок
Tor.
PHP:
<?
echo base_convert('-4641259416', 10, 2)."<br>";
echo base_convert('4641259416', 10, 2);
?>
Или я что то не допонял?
 

Antava

Новичок
-4641259416 = 100010100101000111111111110011000
4641259416 = 100010100101000111111111110011000


в двоичной форме одно и тоже число,
что отрицательное что положительное.
 

whirlwind

TDD infected, paranoid
Antava
тебе что надо получить? 8-byte integer? Дополни нулями до 64 разрядов и включи старший бит, если отрицательное число.
 

SiMM

Новичок
> в двоичной форме одно и тоже число, что отрицательное что положительное.
Ну это вы батенька заврались
-4641259416 = 0xFFFFFFFEEB5C0068
4641259416 = 0x0000000114A3FF98

Как вариант - попробуйте
PHP:
function xrl($a,$b) {
  return (int)join('',unpack('V',pack('V',$a)^pack('V',$b)));
}
echo xrl(-4641259416,42200);
 

Antava

Новичок
Спасибо ВСЕМ !

Tor и whirlwind
Отдельное Большое Спасибо!

SIMM
К сожелению результат возвращает неверный.
 
Сверху