Обсуждение:XOR-обмен
Эта статья тематически связана с вики-проектом «Информационные технологии», цель которого — создание и улучшение статей по темам, связанным с информационными технологиями. Вы можете её отредактировать, а также присоединиться к проекту, принять участие в его обсуждении и поработать над требуемыми статьями. |
8-10 августа 2005 года сведения из статьи «XOR-обмен» появлялись на заглавной странице в колонке «Знаете ли вы». В колонке был представлен текст: «Алгоритм обмена при помощи исключающего ИЛИ можно использовать чтобы обменять значения двух переменных без использования буферной переменной, однако на современных ЦП с распараллеливанием выполнения команд подобная техника обмена приводит к потере производительности». С полным выпуском колонки можно ознакомиться в архиве рубрики «Знаете ли вы». |
Untitled[править код]
"Если бы в PDP-11 такая инструкция была включена, то возможно, что язык Си имел бы возможность обмена переменных как основной бинарный оператор."
Это спекуляция, кажется? --Dennis714 11:19, 5 июня 2010 (UTC)
XorSwap(var1, var1)[править код]
X := 2;// 0b0010 Y := 2;// 0b0010 X := X xor Y;// X=0 (0b0000), Y=2 (0b0010) Y := Y xor X;// X=0 (0b0000), Y=2 (0b0010) X := X xor Y;// X=2 (0b0010), Y=2 (0b0010)
Алгоритм выполнился верно. Значит то предостережение лишнее? kemal 17:22, 23 ноября 2010 (UTC)
Отнюдь, выполнять-то надо не "с равным значением", а "само с собой":
var1:=2; XorSwap(var1, var1); X := X xor Y;// var1=0 Y := Y xor X;// var1=0 X := X xor Y;// var1=0
Восстанавливаю предупреждение, "что-то" для точности заменяю на "переменную". Plainer 13:56, 26 ноября 2012 (UTC)
Верно, или неверно, зависит от того, передаются параметры по значению или по ссылке. 83.237.227.82 15:44, 15 марта 2015 (UTC)
int XorSwapRef( int& a, int& b); /* Здесь, как пишет Plainer, когда XorSwapRef(var1, var1), "выполнять надо само с собой". */
int XorSwapValue( int a, int b); /* здесь XorSwapValue(var1,var1) не приводит к ошибке */
int XorSwapValue( int a, int b); - здесь другая ошибка. Так как алгоритм применяется к копиям переменных, то вызов функции XorSwapValue( int a, int b) не изменит значения фактических параметров. 83.237.224.199 09:40, 23 марта 2015 (UTC)
Часто встречающаяся ошибка в использовании этого алгоритма[править код]
См. правку 20 января 2015,"если некорректно, зачем об этом здесь писать".
В этой правке был удалён текст:
Часто встречается сокращённая запись:
x ^= (y ^= (x ^= y));
Такая запись, однако, некорректна: она эквивалентна
x = x ^ (y ^= (x ^= y)); Вычисления левого (x) и правого (y ^= (x ^= y)) операндов операции ^ не упорядочены по отношению друг к другу, причём левый операнд содержит чтение значения переменной x, а правый — связанный с переменной x побочный эффект. Согласно стандартам C/C++, это приводит к неопределённому поведению.
Цитирую со страницы обсуждения РоманСузи
Зачем? Для того, чтобы читатель знал, что это некорректно. Как Вы думаете, зачем в различных справочниках, учебниках встречаются разделы "Типичные ошибки"? 83.237.227.82 15:04, 15 марта 2015 (UTC)
Пример. Справочник "Скользкие места C++" ( Год: 2006 Автор: Стефан К. Дьюхэрст ). Автор описывает несколько десятков часто встречающихся ошибок. Зачем он это делает? Зачем писать о возможных ошибках, если это ошибки? 83.237.227.82 15:36, 15 марта 2015 (UTC)
- Источник у Вас есть, что «Часто встречается сокращённая запись»? Впрочем, если убрать утверждение о частой встречаемости, то ничего против не имею. Может быть, ещё более явно дать, что код ошибочен:
/* Ошибка! */
. Ссылку на место в стандарте о неопределённом поведении тоже было бы хорошо добавить. РоманСузи 16:51, 15 марта 2015 (UTC)