Побитовый сдвиг большого числа.

Alexi

Новичок
Побитовый сдвиг большого числа.

PHP:
$f1 = 0xed8bc3a0 << 1;
Получается не то число, которое должно быть из-за переполнения.

В той же java, если использовать long всё ок. Как быть в такй ситуации?
 

Dovg

Продвинутый новичок
запускать на архитектуре x64, например ;)
 

Alexi

Новичок
А подскажите как реализовать самому xor для больших чисел, я сделал, т.е. сравниваю с конца и если равны, то 0, если нет, то 1

но получается
то не правильно, т.к. стандартный ^ на маленьких числах выдаёт не тот результат.
 

Alexi

Новичок
Автор оригинала: dimagolov
п.с. а ты как результат формируешь? его переворачивать не забываешь (или дописывать в начало)? ну и недостающие разряды в одном из операндов считать 0-и нужно не забывать...
Я беру 2 числа. Если по длине одно меньше, то дополняю нулями спереди. Само сравнение по цифрам делаю с конца. Всё верно?

Просто столкнулся с такой проблемой, что ксорю 2 числа. Они разные, но если дополнить одно число нулями, то они тогда получаются одинаковы.
 

Alexi

Новичок
Автор оригинала: Вурдалак
Код в студию. :)
PHP:
function my_xor($a, $b)
{
    $len = 0;
    $len_a = strlen($a);
    $len_b = strlen($b);
    
    if ($len_a > $len_b) {
        $len = $len_a;
    } else {
        $len = $len_b;
    }

    $res = '';
    for($i=$len-1; $i>=0; $i--)
    {
        $a_ch = isset($a{$i}) ? (int)$a{$i} : '0';
        $b_ch = isset($b{$i}) ? (int)$b{$i} : '0';

        if ($a_ch == $b_ch) {
            $res .= '0';
        } else {
            $res .= '1';
        }
    }

    $rev = '';
    for($i=strlen($res)-1; $i>=0; $i--)
    {
        $rev .= $res{$i};
    }

    return $rev;
}


echo my_xor('11101101100010111100001110100000000000', '111011011000101111000011101000000000');
Вот как раз пример. Эти 2 числа(если их перевести в десятичную систему разные), но дополнив одно нулями получается что они одинаковые и моя ф-ия возвращает нули.
 

Вурдалак

Продвинутый новичок
Сначала упрости код:
http://php.net/manual/en/function.str-pad.php
http://php.net/manual/en/function.max.php

После того, как дополнишь нулями меньшее по длине число, тебе не потребуется писать isset(...) ? ... : ...

-~{}~ 28.07.10 23:29:

Тебе ещё и не потребуется справа налево пробегаться, плюс переворачивать результат.
 

Alexi

Новичок
Спасибо.

Пока что-то не получается как надо.

А нулями дополнять справа или слева?
И сравнивать надо с конца или с начала?
 

Вурдалак

Продвинутый новичок
Нулями заполнять слева. Как сделаешь выравнивание:
PHP:
for($i = 0, $res = ''; $i < strlen($a); $i++) {
    $res .= ($a[$i] == $b[$i]) ? '0' : '1';
}

return $res;
 
Сверху