|
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
|
|||||||||||
Написать функцию swap26.03.2014, 14:26. Показов 15305. Ответов 73
Метки нет (Все метки)
был вот такой код:
0
|
|||||||||||
| 26.03.2014, 14:26 | |
|
Ответы с готовыми решениями:
73
Заменить функцию swap Чем можно заменить функцию swap? Массив: Описать функцию swap(A,B), меняющую местами максимальные элементы матриц А и В. |
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
||
| 26.03.2014, 17:35 | ||
|
a=a^b 5^5=0 b=a^b 0^5=5 a=a^b 0^5=5 попробовал Добавлено через 1 минуту с минусами плюсами a=a+b; 5+5=10 b=a-b; 10-5=5 a=a-b; 10-5=5
0
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|
| 26.03.2014, 18:21 | |
|
0
|
|
| 26.03.2014, 18:35 | |
|
Эта ситуация возможна, когда обмениваются элементы некоторого набора. Поэтому при использования XOR Swap() обязательна проверка на несовпадение адресов. Ссылку с ходу не дам, но парочка громких фэйлов, связанная с использованием этого трюка в DB точно была.
И, к слову, "наивный" метод с третьей переменной, обычно, эффективнее.
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 26.03.2014, 18:59 | |
Сообщение было отмечено ValeryS как решение
Решение
Вариант с прибитым гвоздями xor (или аналогичный) на современных машинах самый дурацкий. Т.к. вносит прямую зависимость операций, что препятствует эффективному параллельному выполнению внутри конвейера. Т.е. при мизерном выигрыше в памяти получаем замедление выполнения. Еще не стоит забывать, что обменивать так можно только целые числа. И еще, рекомендую чаще смотреть на ассемблерный код, который генерит ваш компилятор, не исключено, что он уже и так оптимизировал вариант с временной переменной, до варианта с xor. Во многих гайдланах к современным компиляторам к тому же написано, что не стоит заниматься ручной микрооптимизацией кода, т.к. это может заблокировать более эффективную и обширную оптимизацию компилятора.
Все это естественно не касается тех, кто пишет под встроенные системы, или около того. Там свои законы, и там оправданное применение xor-swap может найтись. Однако это не отменяет профилирования, а значит доказательства того, что именно этот вариант выигрывает по скорости в нашей задаче. Юзать такое решение по-умолчанию, не очень хорошая идея, но знать про него безусловно полезно.
3
|
|
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||
| 26.03.2014, 19:17 | ||
|
А варианты с ксорами сродни использованию сдвигов вместо деления/умножения на степень двойки. Часто они рассматриваются новичками как некоторое "хакерского" решение (которое якобы должно работать быстрее) без понимания сути происходящего.
2
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|||||||
| 26.03.2014, 19:57 | |||||||
![]()
![]() DrOffset, Tulosba, я с вами полностью согласен а это я так, выпендриваюсь
0
|
|||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 26.03.2014, 20:02 | ||
|
1
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|||
| 26.03.2014, 20:11 | |||
|
"Много что не разрешается, но допускается" я беру адрес и интерпретирую его содержимое по другому UB. там может быть из за несовпадения размеров плавающих и целочисленных
0
|
|||
| 26.03.2014, 20:18 | |
|
0
|
|
| 26.03.2014, 20:19 | |
|
Обсуждение в MSDN: Stupid Coding Tricks
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
||||||
| 26.03.2014, 20:22 | ||||||
|
gazlan,
я так понял что там неоднозначность из-за точек следования недавно где то тема такая пролетала и именно с такой конструкцией
0
|
||||||
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|||
| 27.03.2014, 16:00 | |||
![]() Автор заметки "Stupid Coding Tricks", видимо, плохо понимает, о чём пишет. Он путает 1) порядок выполнения операций ^= этот порядок задан однозначно, т.к. a ^= b ^= a ^= b; эквивалентно a ^= (b ^= (a ^= b) ); 2) порядок вычисления аргументов (сначала a, потом b или наоборот). Здесь, действительно C++ не даёт никаких гарантий. Добавлено через 1 час 22 минуты Здесь (см.пример на C++) ( Алгоритм обмена при помощи исключающего ИЛИ ) (см.пример на C++) объясняется, почему неправильна запись x ^= (y ^= (x ^= y));
0
|
|||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|||||||
| 27.03.2014, 16:08 | |||||||
|
вот такой записью
0
|
|||||||
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|
| 27.03.2014, 21:22 | |
|
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||
| 14.03.2015, 15:42 | ||||||||||||
|
Ксор переполняет каждый бит и гарантированно. В данной задаче это не критично, так как переполнение строго парно и исправляет само себя, но беда ксора в неприменимости к большинству типов.
Добавлено через 2 минуты
Добавлено через 2 минуты Добавлено через 2 минуты
Добавлено через 1 минуту
0
|
||||||||||||
|
Форумчанин
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||
| 14.03.2015, 17:14 | |||||||
|
А для шаблонов - попробуйте передать в swap пользовательский тип. Не вышло? Всё дело в том, что данный алгоритм подходит только для типов, у которых определён operator^. Добавлено через 2 минуты Мой вариант (С++11)
0
|
|||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 14.03.2015, 17:54 | ||
|
0
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|||||
| 14.03.2015, 18:06 | |||||
|
long long тоже самое, что и long long int short тоже самое, что и short int
0
|
|||||
| 14.03.2015, 18:06 | |
|
Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа
Написать функцию, которая, в зависимости от выбора пользователя вызывает соответствующую функцию
не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|