Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
#1

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

15.09.2013, 18:13. Просмотров 3530. Ответов 36
Метки нет (Все метки)

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

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

Обмен значениями двух переменных А и В без использования вспомогательной переменной
Сконструировать алгоритм обмена значениями двух переменных А и В без...

Обмен между значениями двух переменных, не используя при этом третьей переменной
Подскажите как написать программу, которая производит обмен между значениями...

Обмен значениями двух чисел через указатели и функцию
Должны использоваться аргументы типа ( int * ) Вот код: #include...

Обмен значений двух переменных
Ниже решение задачи (Задана целочисленная последовательность A = (a i), i =...

36
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
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;
2
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:21  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
что то сомнения она у меня вызывает похоже на неопределенное поведение
а чем тебя не устраивает классическое
Задали придумать семь способов, 6 уже осилил, нужен седьмой.
0
Catstail
Модератор
23575 / 11676 / 2043
Регистрация: 12.02.2012
Сообщений: 19,049
15.09.2013, 18:24 #4
Цитата Сообщение от ValeryS Посмотреть сообщение
ну или арифметический вариант
- этот вариант может вызвать переполнение...
1
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
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 уже осилил, нужен седьмой.
покаж что осилил
1
Nekto
342 / 287 / 37
Регистрация: 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);
1
Андрей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;
Может не всё подходит не для всех типов, но это и не требуется, нужно чтобы для целых чисел подходило.
0
Catstail
Модератор
23575 / 11676 / 2043
Регистрация: 12.02.2012
Сообщений: 19,049
15.09.2013, 18:44 #8
Цитата Сообщение от ValeryS Посмотреть сообщение
может посему "исключающие ИЛИ" более надежен
да и более красив по моему
- безусловно! И более быстр.
0
Андрей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);
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
0
Nekto
342 / 287 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 18:47 #10
Цитата Сообщение от Андрей1992 Посмотреть сообщение
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
Раздел форума не тот.
0
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
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
1
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,569
Записей в блоге: 1
15.09.2013, 18:55 #12
Цитата Сообщение от Catstail Посмотреть сообщение
- безусловно! И более быстр.
Но не быстрее элементарного и универсального:
C++
1
2
3
x=a;
a=b;
b=x;
1
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 20:47  [ТС] #13
Всем спасибо, нашёл 7 способ.
0
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
15.09.2013, 21:02 #14
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Всем спасибо, нашёл 7 способ.
ну дак покаж
0
Андрей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;
0
User409368
191 / 168 / 32
Регистрация: 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;
0
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
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;
так называемые "упакованные числа"
2
Андрей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;
так называемые "упакованные числа"
Спасибо, классный способ, мне понравился.
0
Catstail
Модератор
23575 / 11676 / 2043
Регистрация: 12.02.2012
Сообщений: 19,049
16.09.2013, 18:20 #19
Цитата Сообщение от Андрей1992 Посмотреть сообщение
классный способ
- так этот способ нечестный: он использует старшие разряды int для двухбайтовых целых. Что эквивалентно наличию аж двух дополнительных 16-битных переменных.
0
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
16.09.2013, 18:26  [ТС] #20
Цитата Сообщение от Catstail Посмотреть сообщение
- так этот способ нечестный: он использует старшие разряды int для двухбайтовых целых. Что эквивалентно наличию аж двух дополнительных 16-битных переменных.
Любой способ имеет право на существование, занесём расход памяти в минус этого способа.
0
16.09.2013, 18:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 18:26

Программа обмена значениями двух переменных a и b
3.8 Составить программу обмена значениями двух переменных a и b. Разработать...

Обмен значениями
Не понимаю, почему в двух последних случаях обмен значений переменных не...

Как осуществить обмен значениями в массиве?
Дан массив: 7 5 8 4 6 1 3 Как отсортировать его по убыванию методом обмена? ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru