Вернуться   Foxter.ru > Мой компьютер > Программирование

Ответ
 
Опции темы Опции просмотра
Старый 07.11.2005, 13:24   #1513  
Новичок
 
Аватар для wary
 
Репутация: 1
Регистрация: 06.11.2005
Сообщения: 12
Сообщение Pascal. Меняем две переменных местами.

Однажды подошел ко мне друг и спросил, как поменять две переменных местами, я не задумываясь ответил: введем третью перенную "c" и проведем такие вот действия:
c:=a;
a:=b;
b:=c;
Тогда он спросил, как это сделать без введения третьей переменной. После минуты раздумья я вот что сказал:
a:=a+b;
b:=a-b;
a:=a-b;
Но на вопрос, как сделать это в две операции я ответить не смог. Тогда он мне показал:
a:=a xor b;
b:=b xor a; Вроде так.
Я знаю, что операция xor означает "исключающее или", но забавно, что и переменные местами меняет и быстро и непонятно.
wary вне форума   Ответить с цитированием
Старый 07.11.2005, 20:13   #1524  
Старожила
 
Аватар для Kostyan
 
Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277
Регистрация: 17.10.2005
Адрес: где то в степях Ярославщины
Сообщения: 399
По умолчанию

Цитата:
Сообщение от wary
a:=a xor b;
b:=b xor a;

Странно... что то не стыкуется в этом методе. Допустим берем две величины а=1FH и b=7H... тогда согласно этим операциям мы получаем в итоге a=18H и b=1F... в случае с b это конечно сработало, но с величиной a какая то неувязочка выходит . Или это только в паскале работает? Хотя не должно, буленова математика стандартна для всех. :this:
Kostyan вне форума   Ответить с цитированием
Старый 08.11.2005, 11:12   #1595  
Новичок
 
Аватар для zQrd
 
Репутация: 1
Регистрация: 07.11.2005
Сообщения: 4
По умолчанию

Не прав ты, wary.
Цитата:
Сообщение от wary
a:=a xor b;
b:=b xor a; Вроде так.
Ключевое слово здесь вроде.

В две операции обменять значения невозможно. Ты пытался привести здесь такой код:
var
X1, X2: Byte;
begin
X1 := X1 xor X2;
X2 := X1 xor X2; // X2 = X1
X1 := X1 xor X2; // X1 = X2
end.

Это самый быстрый способ обмена. И самый красивый.
Чтоб понять, как это работает, советую посидеть с ручкой и листочком и вручную проверить.

Последний раз редактировалось zQrd, 08.11.2005 в 12:25.
zQrd вне форума   Ответить с цитированием
Старый 08.11.2005, 12:23   #1600  
Premium Member
 
Аватар для Vadya corp.
 
Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365Репутация: 123365
Регистрация: 26.10.2005
Сообщения: 293
По умолчанию

На самом деле работает вот так:
a=1;b=2;
a=a xor b;//a=3 b=2
b=a xor b;//a=3 b=1
a=a xor b;//a=2 b=1
__________________
Готовлю еду за PHP и MySQL
Vadya corp. вне форума   Ответить с цитированием
Старый 08.11.2006, 20:02   #30704  
Новичок
 
Аватар для pepper009
 
Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301Репутация: 3301
Регистрация: 08.11.2006
Сообщения: 2
По умолчанию

А в C++ можно в одну строчку:
a=b+(b=a)-a;
pepper009 вне форума   Ответить с цитированием
Старый 20.10.2007, 16:52   #52212  
Новичок
 
Аватар для elkozlova
 
Репутация: 1
Регистрация: 20.10.2007
Сообщения: 6
По умолчанию

Этот вопрос задают на всех собеседованиях)))
elkozlova вне форума   Ответить с цитированием
Старый 21.10.2007, 02:15   #52222  
Старожила
 
Аватар для Kostyan
 
Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277Репутация: 132277
Регистрация: 17.10.2005
Адрес: где то в степях Ярославщины
Сообщения: 399
По умолчанию

есть у архитектуры x386 интересная команда xchg.... меняет значения двух источников местами:

Код:
_asm {
push eax;
push ebx;
mov eax,0x01;
mov ebx,0x02;
xchg eax,ebx;
pop ebx;
pop eax;
}
__________________
the signature is absent
Kostyan вне форума   Ответить с цитированием
Старый 08.12.2007, 20:26   #54439  
Новичок
 
Аватар для Arlikin
 
Репутация: 1
Регистрация: 08.12.2007
Сообщения: 17
По умолчанию

Напомню все началось с Pascal )) А вы уже в ассемблер залезли.
Arlikin вне форума   Ответить с цитированием
Старый 12.12.2007, 15:36   #54656  
Новичок
 
Аватар для Хакер2
 
Репутация: 1
Регистрация: 12.12.2007
Сообщения: 15
По умолчанию

Прикольно. А я про xor ничего не знал. Приду в субботу на информатику, поуминичаю
Хакер2 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей - 0 , гостей - 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Powered by vBulletin
Copyright ©2000-2024, Jelsoft Enterprises Ltd.
[Foxter Skin] developed by: Foxter.ru