IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Обмен значений переменных., Поменять значения переменных местами без использования третьей.
MeatCrash
сообщение 9.04.2006 2:50
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


В общем, в теме уже всё сказано и очень бы хотелось услышать ответ на эту задачу. С 3-ей переменной эту задачу выполнить легче лёгкого, а вот без неё... Я искал и в FAQ и в Задачах, но не нашёл, поэтому и спрашиваю здесь. Заранее благодарен всем за помощь!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
volvo
сообщение 9.04.2006 3:08
Сообщение #2


Гость






Цитата(MeatCrash @ 9.04.2006 2:50)
Я искал и в FAQ и в Задачах, но не нашёл

Ищи лучше... В FAQ это есть:
FAQ: Улучшение кода
 К началу страницы 
+ Ответить 
MeatCrash
сообщение 10.04.2006 3:34
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Спасиб, выручил. Если бы не ты и этот сайт, бросил я наверное изучать паскал в самом начале пути. mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
MeatCrash
сообщение 11.04.2006 1:24
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Хотел спросить про следующий вариант решения:
a := a xor b;
b := a xor b;
a := a xor b;
Как эта штука работает??? Я прилагал все усилия чтобы её понять, но не так и не смог этого сделать. mega_chok.gif Объясни, пожалуйста поподробней как она работает. Заранее благодарен! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 11.04.2006 6:46
Сообщение #5


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(MeatCrash @ 11.04.2006 1:24) *

Как эта штука работает??? Я прилагал все усилия чтобы её понять, но не так и не смог этого сделать. mega_chok.gif Объясни, пожалуйста поподробней как она работает. Заранее благодарен! good.gif

Прежде всего нужно уяснить себе, что операция XOR побитовая, без переноса в соседние биты (в противовес, например, сложению). То есть она работает с первым битом точно так же, как и со вторым, третьим и т.д. - без влияния соседних (или несоседних) битов друг на друга. Так что достаточно разобраться, как она работает для одного бита. В этом случае можно удовлетвориться проверкой четырех различных случаев, которыми исчерпываются все возможные ситуации:
0 и 0
0 и 1
1 и 0
1 и 1
Но попробуем все же более наглядно разобраться..
Сначала приведем табличку для операции XOR:
Код
  | 0 1
--+----
0 | 0 1
1 | 1 0

Во-первых, матрица симметрична, что означает, что операция эта коммутативна, так что можно не следить за порядком операндов.

Во-вторых, заметим, что результат равен 0, если операнды одинаковые, и равен 1, если они разные. Таким образом, первая строчка разбираемой цепочки делает следующее: она оставляет b неизменным, а в a закладывает информацию о том, одинаковые a и b или разные. ПОнятно, что этой информации (в совокупности с неизмененным b) достаточно, чтобы восстановить затертое a.

Далее снова смотрим на табличку. Видим, что при XOR числа на 0 (первый столбец) исходное число остается неизменным (первый столбец совпадает со столбцом, представляющим левый операнд). А при XOR числа на 1 оно меняется на противоположное (второй столбец матрицы противоположен левому операнду). Теперь мы можем понять, что является результатом работы второй строчки. Она воздействует на b нулем (и, соответственно, не изменяет b), если a и b были одинаковые, и воздействует единицей (то есть заменяет на противоположное), если они были разные. Таким образом в перевенной b оказывается изначальное занчение переменной a.

Третья строчка делает то же самое, что и вторая, но уже с новым значением b, то есть с начальным значением a. И в результате в переменной a оказывается начальное значение b.
Все. smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
MeatCrash
сообщение 12.04.2006 5:37
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Ну почти всё понял. В принципе, были догадки о таком положении вещей, но очень смутные. Спасибо за помощь. good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 6:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"