Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> операцию ^ совместить с JavaScript 
V
    Опции темы
admsasha
Дата 21.5.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



в JavaScript есть такой код

6537379050^1797494240, резутат -292829726

если пишу тоже самое на perl, то результат 2497473055


Что это (^) за действие ? 
Почему результаты разные, и как их сделать одинаковыми, что в Perl поправить ?


P.s. ой, не туда вопрос, промазал... модеры прошу перенести... как я понимаю, это должно быть в системном...

Это сообщение отредактировал(а) admsasha - 21.5.2007, 18:10
PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 22.5.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Вообщем надо вот эту функцию переписать, может у кого идеи есть....

Код

function foo(word1,word2) {
    var rez=word1^word2;
    var max32=0xffffffff;
    if ( rez < 0 ) rez = max32 + 1 + rez;
    return rez; 



PM MAIL WWW ICQ Jabber   Вверх
Ivan Kolesnikov
Дата 24.5.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 2
Всего: 6



Твой пост меня заинтересовал... решил разобраться.

Операция которую ты здесь привел - это побитовый xor

Теперь почему разные результаты.

Правильный результат:

Код

  6537379050^1797494240 = 8297113866


Как видно результат больше 2^32 и Javascript приводит его к 32 разрядам

Код

8297113866 - 2*2^32 = -292820726 (у тебя -292829726, я думаю это описка)


Теперь о Perl. Он делает совсем хитро, так как 1-е число не помещается в 32 разряда, он заменяет его максимальным 32 разрядным беззнаковым, то есть 2^32-1 = 4294967295

Получается
Код

4294967295^1797494240 = 2497473055


--------------------
PM MAIL ICQ   Вверх
admsasha
Дата 24.5.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



А идеи есть как javascript код, написать на perl ? (JavaScript код подогнать под perl вроде как получиться, а вот наоборот :-( )

т.е. результаты должны быть одинаковы... но Javascipt код менять нельзя.

Это сообщение отредактировал(а) admsasha - 24.5.2007, 15:17
PM MAIL WWW ICQ Jabber   Вверх
Ivan Kolesnikov
Дата 25.5.2007, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 2
Всего: 6



Вот что я придумал
Код

use warnings;
use strict;

foo(6537379050,1797494240);

sub to_int32 {
  my $v = shift;
  my $c = 0xFFFFFFFF;
  $v-=2*$c while $v>=$c;
  $v+=2*$c while $v<-$c;
  return $v;
};

sub foo {
  my ($word1, $word2) = @_;
  my $r = to_int32(to_int32($word1) ^ to_int32($word2));
  $r = 0xFFFFFFFF + 1 + $r if $r<0;
  return $r;



Оно не совсем в стиле Perl (можно наверное покороче), но на приведенных тобой парах работает, на других не знаю не проверял...
--------------------
PM MAIL ICQ   Вверх
admsasha
Дата 25.5.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(Ivan Kolesnikov @  25.5.2007,  14:42 Найти цитируемый пост)
Оно не совсем в стиле Perl (можно наверное покороче), но на приведенных тобой парах работает, на других не знаю не проверял... 

Результат  4002146572, а надо -292820726, так что не подходит  smile 
PM MAIL WWW ICQ Jabber   Вверх
Ivan Kolesnikov
Дата 25.5.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 2
Всего: 6



Сори... чуть-чуть ошибся

Код

use warnings;
use strict;

print foo1(6537379050,1797494240);
print "\n";
print foo2(6537379050,1797494240);

sub to_int32 {
  my $v = shift;
  my $c = 0x80000000;
  $v-=2*$c while $v>=$c;
  $v+=2*$c while $v<-$c;
  return $v;
};

sub foo1 {
  my ($word1, $word2) = @_;
  my $r = to_int32(to_int32($word1) ^ to_int32($word2));
  $r = 0xFFFFFFFF + 1 + $r if $r<0;
  return $r;
}

sub foo2 {
  my ($word1, $word2) = @_;
  my $r = to_int32($word1) ^ to_int32($word2);
  return $r;
}


Здесь 2 эквивалентные реализации функций, во 2-й меньше действий, а 1-я понятнее. Это уже готовые функции, для того чтобы в 1-й оставить только xor необходимо закоментировать условие smile
--------------------
PM MAIL ICQ   Вверх
admsasha
Дата 25.5.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Если кому интересно.

Код

sub foo{
    $w1=shift;
    $w2=shift;

    $w1 = normal( $w1);^
    $w2 = normal( $w2);^

    $rez= $w1^$w2;
    if($rez >= $maxhalf){
      $rez = -($maxnum-$rez+1);^
      return $rez;
      $rez = $maxnum+$rez+1;^
    }
    return $rez;
}

sub normal {
  my $a = shift;
  my $rez;
  if($a > $maxnum) {
    $rez = $a % $maxnum;
    --$rez;
  } else {
    $rez = $a;
  }
  return $rez
}


Добавлено через 1 минуту и 56 секунд
Ivan Kolesnikov, Странно, но вывод всё равно 

Код

> ./proba.pl
4002146570
4002146570




PM MAIL WWW ICQ Jabber   Вверх
Ivan Kolesnikov
Дата 25.5.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 2
Всего: 6



admsasha,  я запустил приведенную тобой функцию foo для javascript (вместе с условием в конце) ее результат 4002146570

А вообще твой вариант с остатком от деления лучше моего, так как при больших числах мой вариант будет работать очень долго


Это сообщение отредактировал(а) Ivan Kolesnikov - 25.5.2007, 13:20
--------------------
PM MAIL ICQ   Вверх
admsasha
Дата 25.5.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Ivan Kolesnikov, интересно.. а какой браузер ?
PM MAIL WWW ICQ Jabber   Вверх
Ivan Kolesnikov
Дата 25.5.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 2
Всего: 6



Сейчас проверил в IE7, Opera 9, Firefox 2 везде результат один 4002146570.

Запускаю следующую страницу
Код

<script>
function foo(word1,word2) {
    var rez=word1^word2;
    var max32=0xffffffff;
    if ( rez < 0 ) rez = max32 + 1 + rez;
    return rez; 
}
alert(foo(6537379050,1797494240)); 
</script>



Это сообщение отредактировал(а) Ivan Kolesnikov - 25.5.2007, 13:37
--------------------
PM MAIL ICQ   Вверх
admsasha
Дата 25.5.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Ivan Kolesnikov, Разобрался, это я не так считал...
я в примере то давал только результат word1^word2, а так, да формула вроде верная. Спасибо.


Вообщем тема пока закрыта. Вроде как всё работает. 


Это сообщение отредактировал(а) admsasha - 25.5.2007, 14:05
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0975 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.