Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.01.2007, 19:37
Новичок

Отправить личное сообщение для Мёртвый Анархист Посмотреть профиль Найти все сообщения от Мёртвый Анархист
 
Регистрация: 15.01.2007
Сообщений: 6

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

Код на Pascale:

a:=a xor b;
b:=b xor a;
a:=a xor b;


  #2  
Старый 15.01.2007, 21:34
Пользователь

Отправить личное сообщение для persicum Посмотреть профиль Найти все сообщения от persicum
 
Регистрация: 11.01.2007
Сообщений: 28

Здорово!
Первый раз вижу такое изящество!!!
Теперь буду применять.

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

если вместо XOR применять обычное сложение-вычитание,
то может произойти переполнение-потеря значимости.
  #3  
Старый 16.01.2007, 07:57
MBo MBo вне форума
Местный

Отправить личное сообщение для MBo Посмотреть профиль Найти все сообщения от MBo
 
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,374

procedure XorSwap(var a, b: Integer);
begin
a:=a xor b;
b:=b xor a;
a:=a xor b;
end;

Неверно сработает, если оба входных параметра указывают на один адрес

XorSwap(i, i);
  #4  
Старый 16.01.2007, 08:36
Пользователь

Отправить личное сообщение для persicum Посмотреть профиль Найти все сообщения от persicum
 
Регистрация: 11.01.2007
Сообщений: 28

Сообщение от MBo Посмотреть сообщение
Неверно сработает, если оба входных параметра указывают на один адрес

XorSwap(i, i);
Но тогда они равны.
if a=b then exit;
  #5  
Старый 16.01.2007, 10:12
MBo MBo вне форума
Местный

Отправить личное сообщение для MBo Посмотреть профиль Найти все сообщения от MBo
 
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,374

>persicum
Да, конечно. Это просто пример входных данных, на которых процедура без учета вашего добавления некорректно работает
  #6  
Старый 16.01.2007, 15:51
Новичок

Отправить личное сообщение для Steex Посмотреть профиль Найти все сообщения от Steex
 
Регистрация: 30.09.2006
Адрес: Беларусь, Минск
Сообщений: 5

Сообщение от persicum Посмотреть сообщение
Здорово!
Первый раз вижу такое изящество!!!
Теперь буду применять.
На C++ мне больше нравится:

a ^= b ^= a ^= b;

  #7  
Старый 17.01.2007, 09:54
pav pav вне форума
Пользователь

Отправить личное сообщение для pav Посмотреть профиль Найти все сообщения от pav
 
Регистрация: 25.09.2006
Сообщений: 86

Сообщение от Steex Посмотреть сообщение
На C++ мне больше нравится:
Какой С++?, какой Pascal?
Это же обмен содержимого в двух регистров без привлечения третьего. Автор мне неизвестен, однако этот прием применялся, судя по литературе, еще в 60-х годах.
  #8  
Старый 17.01.2007, 14:28
Новичок

Отправить личное сообщение для Sergeyev Посмотреть профиль Найти все сообщения от Sergeyev
 
Регистрация: 22.09.2006
Сообщений: 23

Почему не сработает при равных?
a=5, b=5
a:=5 xor 5 = 0
b:= 5 xor 0 = 5
a:= 0 xor 5 = 5

Вообще есть и без xor методы.
С вычитанием.
a:=a+b;
b:=a-b;
a:=a-b;

У Кнута вроде как рассматривался вопрос.
  #9  
Старый 17.01.2007, 14:29
Новичок

Отправить личное сообщение для Sergeyev Посмотреть профиль Найти все сообщения от Sergeyev
 
Регистрация: 22.09.2006
Сообщений: 23

не сработать может на знаковых. какая там ерунда будет со старшим битом. возможно...
или - для чисел с плавающей точкой.
  #10  
Старый 17.01.2007, 15:22
MBo MBo вне форума
Местный

Отправить личное сообщение для MBo Посмотреть профиль Найти все сообщения от MBo
 
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,374

>почему не сработает при равных?
не сработает, если оба входных параметра - указатель на одну и ту же переменную
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бинарный посик - помогите разобраться Димка Сортировка и поиск 12 06.01.2011 14:36