Форум «Всё о Паскале» _ Задачи _ Обмен значений переменных.
Автор: MeatCrash 9.04.2006 6:50
В общем, в теме уже всё сказано и очень бы хотелось услышать ответ на эту задачу. С 3-ей переменной эту задачу выполнить легче лёгкого, а вот без неё... Я искал и в FAQ и в Задачах, но не нашёл, поэтому и спрашиваю здесь. Заранее благодарен всем за помощь!
Автор: volvo 9.04.2006 7:08
Цитата(MeatCrash @ 9.04.2006 2:50)
Я искал и в FAQ и в Задачах, но не нашёл
Ищи лучше... В FAQ это есть: http://forum.pascal.net.ru/index.php?s=&showtopic=1741&view=findpost&p=34169
Автор: MeatCrash 10.04.2006 7:34
Спасиб, выручил. Если бы не ты и этот сайт, бросил я наверное изучать паскал в самом начале пути.
Автор: MeatCrash 11.04.2006 5:24
Хотел спросить про следующий вариант решения:
a := a xor b; b := a xor b; a := a xor b;
Как эта штука работает??? Я прилагал все усилия чтобы её понять, но не так и не смог этого сделать. Объясни, пожалуйста поподробней как она работает. Заранее благодарен!
Автор: lapp 11.04.2006 10:46
Цитата(MeatCrash @ 11.04.2006 1:24)
Как эта штука работает??? Я прилагал все усилия чтобы её понять, но не так и не смог этого сделать. Объясни, пожалуйста поподробней как она работает. Заранее благодарен!
Прежде всего нужно уяснить себе, что операция 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. Все.
Автор: MeatCrash 12.04.2006 9:37
Ну почти всё понял. В принципе, были догадки о таком положении вещей, но очень смутные. Спасибо за помощь.