Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 15:08   #1
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию Операторы побитного присваивания в алгоритме Эвклида

Доброго времени суток.

Наткнулся в Интернете на реализацию алгоритма Эвклида (алгоритм для нахождения наибольшего общего делителя) для двух чисел. Собственно, рабочий код:
Код:
#include <iostream>

using namespace std;

int main(){
  int a, b; scanf("%d %d", &a, &b);
  while(b) b ^= a ^= b ^= a %= b;
  printf("%d", a);
  return 0;
}
Меня очень заинтересовала строчка с циклом while() в этом коде. Вот это вот побитовое сравнение... Как оно происходит в данном случае, зачем оно нужно и какая вообще тут последовательность выполнения операций? Так много знаков равно в одной записи я ещё не видел...
Nomicos вне форума Ответить с цитированием
Старый 13.06.2012, 16:15   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
b ^= a ^= b ^= a;
Начнем с того, что побитового сравнения здесь нет. Это реализация функции swap (меняющей местами аргументы) через побитовый xor. В целом это делается так:
Код:
b = b ^ a;
a = a ^ b;
b = b ^ a;
Правильность такого вытекает из свойств операции xor. Соответственно, строка в начала сообщения - просто обмен значениями между a и b.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 13.06.2012, 18:37   #3
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Код:
b ^= a ^= b ^= a;
Начнем с того, что побитового сравнения здесь нет. Это реализация функции swap (меняющей местами аргументы) через побитовый xor.
Но что сначала выполняется? Нахождение остатка от деления a на b и присваивание его a, а потом уже вся эта замена, или наоборот?
Nomicos вне форума Ответить с цитированием
Старый 13.06.2012, 19:38   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Да, сначала остаток, потом замена. Справа налево.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 13.06.2012, 20:09   #5
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Да, сначала остаток, потом замена. Справа налево.
Все равно, в этой операции слишком много операндов... Не, ну вот swap(a,b) — это я ещё могу понять. Но вот уже a ^= b, а уж тем более то, что было написано в моём первом посте — вообще не могу. Не могли бы подсказать статьи, посвящённые этой реализации функции swap()? В Google пытался искать, но мне кажется, он вообще знак ^= игнорирует...
Nomicos вне форума Ответить с цитированием
Старый 13.06.2012, 21:54   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Все равно, в этой операции слишком много операндов...
А как Вы собираетесь дальше учиться? Эта конструкция вполне себе безобидна в сравнении с, например, указателями на члены шаблонов. Расставьте скобки и понимать тут будет нечего:
Код:
b ^= (a ^= (b ^= (a %= b)));
Цитата:
Не могли бы подсказать статьи, посвящённые этой реализации функции swap()?
Это вполне общеизвестная вещь, основанная на свойствах исключающего или. Писать про это статью - как писать книгу, посвященную возведению двойки в квадрат.
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 13.06.2012 в 21:56.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно разобраться в алгоритме. ladyanna Помощь студентам 0 03.06.2012 16:54
Ошибка в алгоритме parkito Общие вопросы C/C++ 1 07.12.2011 04:25
Помогите в алгоритме Евклида AhmetJan Общие вопросы C/C++ 5 24.01.2009 22:40
Как изобразить в алгоритме!!?? Шурик Общие вопросы Delphi 0 23.10.2007 00:10