Форум программистов, компьютерный форум CyberForum.ru

Обмен значениями двух переменных - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:13     Обмен значениями двух переменных #1
Нашёл на другом форуме занятную формулу обмена значений двух переменных(очевидно на с++):
b = – –a + (a=b)*0;
Проверил на числах 1 и 101, рез 101 и 101. Помогите, было бы круто, формула в одну строку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2013, 18:13     Обмен значениями двух переменных
Посмотрите здесь:

Обмен переменных string C++
C++ Массивы (ввести данные целого типа, вывести на экран, выполните обмен значениями)
C++ Обмен значениями двух переменных А и В без использования вспомогательной переменной
C++ Программа обмена значениями двух переменных a и b
Обмен между значениями двух переменных, не используя при этом третьей переменной C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
15.09.2013, 18:19     Обмен значениями двух переменных #2
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Помогите, было бы круто, формула в одну строку.
что то сомнения она у меня вызывает похоже на неопределенное поведение
а чем тебя не устраивает классическое
C++
1
2
3
a=a^b;
b=b^a;
a=a^b;
ну или арифметический вариант
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:21  [ТС]     Обмен значениями двух переменных #3
Цитата Сообщение от ValeryS Посмотреть сообщение
что то сомнения она у меня вызывает похоже на неопределенное поведение
а чем тебя не устраивает классическое
Задали придумать семь способов, 6 уже осилил, нужен седьмой.
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
15.09.2013, 18:24     Обмен значениями двух переменных #4
Цитата Сообщение от ValeryS Посмотреть сообщение
ну или арифметический вариант
- этот вариант может вызвать переполнение...
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
15.09.2013, 18:36     Обмен значениями двух переменных #5
Цитата Сообщение от Catstail Посмотреть сообщение
- этот вариант может вызвать переполнение...
может посему "исключающие ИЛИ" более надежен
да и более красив по моему
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Задали придумать семь способов, 6 уже осилил, нужен седьмой.
ну этот то явно не годится или ты не так списал
Цитата Сообщение от Андрей1992 Посмотреть сообщение
b = – –a + (a=b)*0;
смотри 2 числа
сначала a=b поскольку в скобках
получилось два числа b
потом умножаем на 0
получаем
b= - -b+0;
b=b

Добавлено через 2 минуты
Цитата Сообщение от Андрей1992 Посмотреть сообщение
6 уже осилил, нужен седьмой.
покаж что осилил
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 18:39     Обмен значениями двух переменных #6
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Нашёл на другом форуме занятную формулу обмена значений двух переменных(очевидно на с++):
b = – –a + (a=b)*0;
Проверил на числах 1 и 101, рез 101 и 101. Помогите, было бы круто, формула в одну строку.
C++
1
2
3
#include <utility>
...
std::swap(a, b);
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:43  [ТС]     Обмен значениями двух переменных #7
Цитата Сообщение от ValeryS Посмотреть сообщение
покаж что осилил
Доп. переменная
C++
1
2
3
с=a;
a=b;
b=c;
Сумма-разность
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
XOR
C++
1
2
3
a=a^b;
b=b^a;
a=a^b;
Сумма
C++
1
2
3
a=-(a+b);
b=-(a+b);
a=-(a+b);
Деление умножение
C++
1
2
3
a=a/b;
b=b*a;
a=b/a;
Какая-то абракадабра
C++
1
2
3
a=a+2*(b-a);
b=b-(a-b);
a=a-(a-b)/2;
Может не всё подходит не для всех типов, но это и не требуется, нужно чтобы для целых чисел подходило.
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
15.09.2013, 18:44     Обмен значениями двух переменных #8
Цитата Сообщение от ValeryS Посмотреть сообщение
может посему "исключающие ИЛИ" более надежен
да и более красив по моему
- безусловно! И более быстр.
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:46  [ТС]     Обмен значениями двух переменных #9
Цитата Сообщение от Nekto Посмотреть сообщение
C++
1
2
3
#include <utility>
...
std::swap(a, b);
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 18:47     Обмен значениями двух переменных #10
Цитата Сообщение от Андрей1992 Посмотреть сообщение
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
Раздел форума не тот.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
15.09.2013, 18:53     Обмен значениями двух переменных #11
в порядке бреда
цикл через флаг переноса (поскольку в Си нет эмулируем)
для байта
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned char a=5;
unsigned char b=7;
 
unsigned char bt1=a&0x01;
unsigned char bt2=b&0x01;
 
for(int i=0;i<8;i++)
{
 a=a>>1+0x80*bt2;
 b=b>>1+0x80*bt1;
 bt1=a&0x01;
 bt2=b&0x01;
}
для int цикл увеличить до 32 и умножать на 0x80000000
zer0mail
2177 / 1860 / 187
Регистрация: 03.07.2012
Сообщений: 6,618
Записей в блоге: 1
15.09.2013, 18:55     Обмен значениями двух переменных #12
Цитата Сообщение от Catstail Посмотреть сообщение
- безусловно! И более быстр.
Но не быстрее элементарного и универсального:
C++
1
2
3
x=a;
a=b;
b=x;
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 20:47  [ТС]     Обмен значениями двух переменных #13
Всем спасибо, нашёл 7 способ.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
15.09.2013, 21:02     Обмен значениями двух переменных #14
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Всем спасибо, нашёл 7 способ.
ну дак покаж
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 22:43  [ТС]     Обмен значениями двух переменных #15
Цитата Сообщение от ValeryS Посмотреть сообщение
ну дак покаж
Ничего интересного, обычное извращение с арифметикой.
C++
1
2
3
a=a*10000+b;
b=a / 10000;
a=a % 10000;
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
15.09.2013, 22:50     Обмен значениями двух переменных #16
вот восьмой способ ))
C++
1
2
3
4
5
6
7
8
9
    int a, b;
    cin >> a;   // 2
    cin >> b;   // 3
 
    a+=b;       // a=5
    b=a-b;      // b=5-3=2
    a=a-b;      // a=5-2=3
 
    cout << a << " " << b;
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
15.09.2013, 22:59     Обмен значениями двух переменных #17
_,
извини конечно но это не восьмой а второй способ что у автора что у меня
Цитата Сообщение от ValeryS Посмотреть сообщение
ну или арифметический вариант
C++
1
2
3
a=a+b;
b=a-b;
a=a-b
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Сумма-разность
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
и вот на него реакция
Цитата Сообщение от Catstail Посмотреть сообщение
- этот вариант может вызвать переполнение...
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Ничего интересного, обычное извращение с арифметикой.
мда, имеет место быть но для чисел положительных и меньше 9999
на эту же тему логический способ
числа положительные и не больше 16 бит
C++
1
2
3
a=a<<16|b;
b=a>>16;
a=a&0xFFFF;
так называемые "упакованные числа"
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
16.09.2013, 18:15  [ТС]     Обмен значениями двух переменных #18
Цитата Сообщение от ValeryS Посмотреть сообщение
на эту же тему логический способ
числа положительные и не больше 16 бит
C++
1
2
3
a=a<<16|b;
b=a>>16;
a=a&0xFFFF;
так называемые "упакованные числа"
Спасибо, классный способ, мне понравился.
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
16.09.2013, 18:20     Обмен значениями двух переменных #19
Цитата Сообщение от Андрей1992 Посмотреть сообщение
классный способ
- так этот способ нечестный: он использует старшие разряды int для двухбайтовых целых. Что эквивалентно наличию аж двух дополнительных 16-битных переменных.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 18:26     Обмен значениями двух переменных
Еще ссылки по теме:

Вывести результат двух операций с использованием двух переменных C++
C++ Определить процедуру, осуществляющую обмен значениями двух переменных
C++ Составить программу обмена значениями трёх переменных

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
16.09.2013, 18:26  [ТС]     Обмен значениями двух переменных #20
Цитата Сообщение от Catstail Посмотреть сообщение
- так этот способ нечестный: он использует старшие разряды int для двухбайтовых целых. Что эквивалентно наличию аж двух дополнительных 16-битных переменных.
Любой способ имеет право на существование, занесём расход памяти в минус этого способа.
Yandex
Объявления
16.09.2013, 18:26     Обмен значениями двух переменных
Ответ Создать тему
Опции темы

Текущее время: 01:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru