Помогите данный JavaScript перевести на perlfunction foo(word1,word2) {
var rez=word1^word2;
var max32=0xffffffff;
if ( rez < 0 ) rez = max32 + 1 + rez;
return rez;
}
>Помогите данный JavaScript перевести на perl
>
>function foo(word1,word2) {
> var rez=word1^word2;
> var max32=0xffffffff;
> if ( rez < 0 ) rez =
>max32 + 1 + rez;
> return rez;
>}sub foo {
my ($word1, $word2)=@_;
my $res=$word1^$word2;
my $max32=0xffffffff;
$res += $max32 + 1 if ($res < 0);
return $res;
}(запускать не пробовал, но вроде так)
>>Помогите данный JavaScript перевести на perl
>>
>>function foo(word1,word2) {
>> var rez=word1^word2;
>> var max32=0xffffffff;
>> if ( rez < 0 ) rez =
>>max32 + 1 + rez;
>> return rez;
>>}
>
>sub foo {
> my ($word1, $word2)=@_;
> my $res=$word1^$word2;
> my $max32=0xffffffff;
> $res += $max32 + 1 if ($res < 0);
> return $res;
>}
>
>(запускать не пробовал, но вроде так)В этом то вся и есть проблема, что в лоб нечего не получится
javascript и perl код дадут разные результаты...
>>>Помогите данный JavaScript перевести на perl
>
>В этом то вся и есть проблема, что в лоб нечего не
>получится
>
>javascript и perl код дадут разные результаты...
наверное разные подходы к вычислению, скажи а нафига такая мудреная функция? Из глубин памяти всплывают какие то древние ассоциации про дополнительный код.
ну ладно вот я провел эксперимент, может быть он натолкнет тебя на умные мысли?
----------------------
#!/usr/bin/perl -w
use strict;my $word1 = shift or die("not defined first argument");
my $word2 = shift or die("not defined second argument");my $w1 = hex $word1;
print "first: $word1 =\t $w1\n";
my $w2 = hex $word2;
print "second: $word2=\t $w2\n";my $rez= $w1 ^ $w2;
my $maxnum = 255;
my $maxhalf = $maxnum>>1;
print "maxnum = $maxnum, halfmax = $maxhalf\n";
print "first rez = $rez\n";
if($rez >= $maxhalf)
{
$rez = -($maxnum-$rez+1);
print "negative rez = $rez\n";
$rez = $maxnum+$rez+1;
}
my $si = sprintf "%02X", $rez;
print "$rez =\t '$si'\n";
exit(0);
---------------------------------
запускаем так:
./hex_xor.pl 0xFE 0x00
./hex_xor.pl 0xFF 0x00
./hex_xor.pl 0xFE 0x7E
В итоге для байта видим, что перл нифига отритцательные числа не получает поэтому код функции будет:
sub foo {
my ($word1, $word2)=@_;
my $res=$word1^$word2;
return $res;
}Да кстати этот эксперимент, можно легко расширить до 32 разрядных чисел.
:-)))
>>>Помогите данный JavaScript перевести на perl
>>>
>>>function foo(word1,word2) {
>>> var rez=word1^word2;
>>> var max32=0xffffffff;
>>> if ( rez < 0 ) rez =
>>>max32 + 1 + rez;
>>> return rez;
>>>}
>>
>>sub foo {
>> my ($word1, $word2)=@_;
>> my $res=$word1^$word2;
>> my $max32=0xffffffff;
>> $res += $max32 + 1 if ($res < 0);
>> return $res;
>>}
>>
>>(запускать не пробовал, но вроде так)
>
>В этом то вся и есть проблема, что в лоб нечего не
>получится
>
>javascript и perl код дадут разные результаты...а чем отличаются?
(подозреваю, что javascript тоже может дать разные результаты на разных браузерах ,-)))
>>>>Помогите данный JavaScript перевести на perl
>>>>
>>>>function foo(word1,word2) {
>>>> var rez=word1^word2;
>>>> var max32=0xffffffff;
>>>> if ( rez < 0 ) rez =
>>>>max32 + 1 + rez;
>>>> return rez;
>>>>}
>>>
>>>sub foo {
>>> my ($word1, $word2)=@_;
>>> my $res=$word1^$word2;
>>> my $max32=0xffffffff;
>>> $res += $max32 + 1 if ($res < 0);
>>> return $res;
>>>}
>>>
>>>(запускать не пробовал, но вроде так)
>>
>>В этом то вся и есть проблема, что в лоб нечего не
>>получится
>>
>>javascript и perl код дадут разные результаты...
>
>а чем отличаются?
>(подозреваю, что javascript тоже может дать разные результаты на разных браузерах ,-)))
>на JS 6537379050^1797494240, результат -292820726
если пишу тоже самое на perl, то результат 2497473055
>на JS 6537379050^1797494240, результат -292820726
>
>если пишу тоже самое на perl, то результат 2497473055А что, собственно, вы хотите получить: функцию, дающую такой же результат, как ваша функция на JS или функцию, дающую определённый результат (не важно, на каком языке она реализована)? Если второе, то какой результат вы хотите получить? В частности, знаковые или беззнаковые у вас предполагаются аргументы и возвращаемое значение и какого они размера? Типы данных, используемые в различных языках хорошо описаны, так что результат предсказуем - иначе их нельзя было бы использовать.
>>на JS 6537379050^1797494240, результат -292820726
>>
>>если пишу тоже самое на perl, то результат 2497473055
>
>А что, собственно, вы хотите получить: функцию, дающую такой же результат, как
>ваша функция на JS или функцию, дающую определённый результат (не важно,
>на каком языке она реализована)? Если второе, то какой результат вы
>хотите получить? В частности, знаковые или беззнаковые у вас предполагаются аргументы
>и возвращаемое значение и какого они размера? Типы данных, используемые в
>различных языках хорошо описаны, так что результат предсказуем - иначе их
>нельзя было бы использовать.
Я хочу получить на perl результат точно такой же как и на JavaScript.
>>>>>Помогите данный JavaScript перевести на perl
>
>на JS 6537379050^1797494240, результат -292820726
>
>если пишу тоже самое на perl, то результат 2497473055Скажу так, оба языка дают неверный результат!!!!
0x185A87CEA 110000101101010000111110011101010
0x6B2395E0 1101011001000111001010111100000
------------------------------------------------xor
0x1EE8BE90A 111101110100010111110100100001010dec: 8297113866
догадаешься почему? у тебя первое число выходит за границы 32 бит,
в резульате и функция твоя будет работать не правильно, в любом языке
если ты ей будешь подавать на вход числа больше 32 бит.
>>>>>>Помогите данный JavaScript перевести на perl
>>
>>на JS 6537379050^1797494240, результат -292820726
>>
>>если пишу тоже самое на perl, то результат 2497473055
>
>Скажу так, оба языка дают неверный результат!!!!
>0x185A87CEA 110000101101010000111110011101010
> 0x6B2395E0 1101011001000111001010111100000
>------------------------------------------------xor
>0x1EE8BE90A 111101110100010111110100100001010
>
>dec: 8297113866
>
>догадаешься почему? у тебя первое число выходит за границы 32 бит,
>в резульате и функция твоя будет работать не правильно, в любом языке
>
>если ты ей будешь подавать на вход числа больше 32 бит.Это я знаю. Но как совместить функции :-(
>Это я знаю. Но как совместить функции :-(Ну мог бы и сам! раз знаешь, ну ладно смотри:
0x185A87CEA 110000101101010000111110011101010
0x6B2395E0 1101011001000111001010111100000
------------------------------------------------xor
0x1EE8BE90A 111101110100010111110100100001010
perl 10010100110111000110101000011111 2497473055здесь все ясно - отбросили старший бит.
javascript 11101110100010111110100100001010 -292820726perl работает так
bash-3.00$ ./bag_hex_xor32.pl 6537379050 1797494240
first: 6537379050 = 6537379050
second: 1797494240= 1797494240
after $w1 &= 0xfffffffff;
first: 6537379050 = 4294967295 < !!!! перл оставляет максимум от числа, этот максимум потом используется при хор!!!
second: 1797494240= 1797494240first rez = 2497473055 !!!!!!! rez как раз получается после хор между аргументами
maxnum = 4294967295, halfmax = 2147483647
negative rez = -1797494241
2497473055 = '94DC6A1F'dec: 8297113866
теперь как сделать:
вот кусок программы(фактически основная часть тестов):
....
my $maxnum = 0xffffffff;
my $maxhalf = $maxnum>>1;
$w1 = normal( $w1);
$w2 = normal( $w2);
print "first: $word1 =\t $w1\n";
print "second: $word2=\t $w2\n";$rez= $w1^$w2;
#print $w1^$w2;
print "first rez = ".$rez."\n";
print "maxnum = $maxnum, halfmax = $maxhalf\n";
if($rez >= $maxhalf)
{
$rez = -($maxnum-$rez+1);
print "negative rez = $rez\n";
$rez = $maxnum+$rez+1;
}
my $si = sprintf "%08X", $rez;
print "$rez =\t '$si'\n";
exit(0);
sub normal {
my $a = shift;
my $rez;
if($a > $maxnum) {
$rez = $a % $maxnum;
--$rez;
} else {
$rez = $a;
}
return $rez
}ну и результат:
bash-3.00$ ./bag_hex_xor32.pl 6537379050 1797494240
first: 6537379050 = 6537379050
second: 1797494240= 1797494240
first: 6537379050 = 2242411754
second: 1797494240= 1797494240
first rez = 4002146570
maxnum = 4294967295, halfmax = 2147483647
negative rez = -292820726
4002146570 = 'EE8BE90A'
>ну и результат:
>bash-3.00$ ./bag_hex_xor32.pl 6537379050 1797494240
>first: 6537379050 = 6537379050
>second: 1797494240= 1797494240
>first: 6537379050 = 2242411754
>second: 1797494240= 1797494240
>first rez = 4002146570
>maxnum = 4294967295, halfmax = 2147483647
>negative rez = -292820726
>4002146570 = 'EE8BE90A';-))) забыл добавить, теперь обе программы работают одинаково... одинаково неправильно ;-))
если тебя это интересовало.
>Помогите данный JavaScript перевести на perl
>
>function foo(word1,word2) {
> var rez=word1^word2;
> var max32=0xffffffff;
> if ( rez < 0 ) rez =
>max32 + 1 + rez;
> return rez;
>}мысль:
32 или 64 битные машинки?
>>Помогите данный JavaScript перевести на perl
>>
>>function foo(word1,word2) {
>> var rez=word1^word2;
>> var max32=0xffffffff;
>> if ( rez < 0 ) rez =
>>max32 + 1 + rez;
>> return rez;
>>}
>
>мысль:
>32 или 64 битные машинки?32битные