добавляются лишнии цыфры....

таещефигня

Новичок
добавляются лишнии цыфры....

кто знает в чем глюк такой может быть, прибавляю идет цикл $sum += $delta; $delta = 0x9e3779b9; но на моей машине sum=3c6ef372 а на серве sum=13c6ef372

тоесть вот прибавилась одна цивра впереди, вот еще пару значений:

мой комп:
sum=daa66d2b
sum=78dde6e4
sum=1715609d
sum=b54cda56
sum=5384540f
sum=f1bbcdc8
sum=8ff34781
sum=2e2ac13a
sum=cc623af3
sum=6a99b4ac
sum=8d12e65

серв:
sum=13c6ef372
sum=1daa66d2b
sum=278dde6e4
sum=31715609d
sum=3b54cda56
sum=45384540f
sum=4f1bbcdc8
sum=58ff34781
sum=62e2ac13a
sum=6cc623af3
sum=76a99b4ac
sum=808d12e65

кто может подсказать из за чего это? есть подозрение что это из за 64 битности серва, но тогда как с этим бороться? ибо в этоге получаемый результат является ошибочным...
 

таещефигня

Новичок
задача формирование активационного кода для программы, там задача намного шире, просто когда закачал на серв, и результат был неправильный, начал с дельты, и уже она считается неверно...
 

таещефигня

Новичок
я перед тем как задавать этот вопрос пробывал, но так и непридумал по каким словам искать
 

таещефигня

Новичок
везде тока проблемы, решений ненашел....

-~{}~ 13.04.07 17:09:

я вот думаю может переписать побитовые операции своими функциями, где буду ограничевать 32 битами, но может кто то это уже делал? хотябы на С или С++???
 

EugeneVC

Новичок
в С++ очень часто бывают переполнения
скажем тип short i всего до 65535
нет ли тут такой загвоздки
 

таещефигня

Новичок
вроде почти все решил, но тут опять одна проблемка появилась.... это сдвиг вправо:
привожу пример:
есть код:
$x = 0xc53900da;
print decbin($x).'<br>';
print decbin($x >> 1).'<br>';
print decbin($x >> 2).'<br>';
print decbin($x >> 3).'<br>';
print decbin($x >> 4).'<br>';
print decbin($x >> 5).'<br>';
на 32 битной машине:
11000101001110010000000011011010
11100010100111001000000001101101
11110001010011100100000000110110
11111000101001110010000000011011
11111100010100111001000000001101
11111110001010011100100000000110
на 64 битной:
11000101001110010000000011011010
1100010100111001000000001101101
110001010011100100000000110110
11000101001110010000000011011
1100010100111001000000001101
110001010011100100000000110
почему так? из определения:
Сдвиг вправо. Двоичное представление первого операнда сдвигается вправо на количество разрядов, равное значению второго операнда. Освобождающиеся «левые» разряды будут заполняться нулями.
тогда выходит именно на 32 битной как то нетак считается? но программа написанная на С++ считает именно также как и скрипт на 32 битной машине
 

таещефигня

Новичок
понял, спасиба

-~{}~ 16.04.07 20:09:

для тех если кому нить понадобиться инфа как я решил....
решение может и не идеальное но работающее:

function leftshift32($a,$bits)
{
$a = $a << $bits;
$a = dechex($a);
$a = substr($a, -8);
return hexdec($a);
}

function rightshift32($a, $bits)
{
$binary = decbin($a);
$binary = substr($binary, -32);
$binary = str_pad($binary, 32, '0', STR_PAD_LEFT);
for($i=0;$i<$bits;$i++)
{
$binary = $binary[0].$binary;
$binary = substr($binary, 0, -1);
}
return bindec($binary);
}

function summ32($a,$b)
{
$c = $a + $b;
$c = dechex($c);
$c = substr($c, -8);
return hexdec($c);
}

function xor32($a,$b)
{
$c = $a ^ $b;
$c = dechex($c);
$c = substr($c, -8);
return hexdec($c);
}
 

SiMM

Новичок
Вообще-то, чтобы превратить арифметический сдвиг вправо в логический достаточно обнулить старший бит после сдвига :)
 
Сверху