Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Etyuhibosecyu
4 / 7 / 4
Регистрация: 13.07.2017
Сообщений: 353
1

Замена оператора Xor

02.11.2017, 21:01. Просмотров 795. Ответов 10
Метки нет (Все метки)

Кто знает, чем заменить этот оператор для условий? Какой-то грамотей создал побитовый Xor - "^", но не создал обычный, для проверки условий. Пока что сделал так:
C++
1
2
if ((a == true && b == false) || (a == false && b == true)) {}
//Вместо: if (a == true xor b == true) {}
Нет способа написать это же короче?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2017, 21:01
Ответы с готовыми решениями:

Замена оператора %
Привет всем форумчанам! Впервые тут, так как только начал учиться...

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как...

Неправильная работа оператора присваивания после работы оператора суммирования
Доброго времени суток. У меня есть класс вектор class TVector {//ewde...

Придумайте простую программу с использованием условного оператора IF и оператора switch
Пожалуйста, придумайте простую программу с использованием: условного оператора...

Вызов прегруженного оператора вывода в поток из аналогичного оператора
Программирую в c9.io с g++ получается тоже самое. Элементами стека(pointList)...

10
New man
212 / 140 / 56
Регистрация: 23.05.2011
Сообщений: 740
Завершенные тесты: 4
02.11.2017, 21:04 2
^ работает не хуже.

Исключение — когда у вас не буловский тип используется как логический.
0
Colt_11
10 / 10 / 11
Регистрация: 18.01.2016
Сообщений: 95
02.11.2017, 21:06 3
если a и b переменные типа bool то можно так
C++
1
if (a != b) {}
0
Etyuhibosecyu
4 / 7 / 4
Регистрация: 13.07.2017
Сообщений: 353
02.11.2017, 21:06  [ТС] 4
А например, вместо такого:
if (a1 == a2 xor b1 == b2) {}
Как написать это на C++?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4772 / 2429 / 679
Регистрация: 18.10.2014
Сообщений: 4,150
02.11.2017, 21:08 5
Лучший ответ Сообщение было отмечено Etyuhibosecyu как решение

Решение

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А например, вместо такого:
if (a1 == a2 xor b1 == b2) {}
Как написать это на C++?
C++
1
if ((a1 == a2) != (b1 == b2))
1
Etyuhibosecyu
4 / 7 / 4
Регистрация: 13.07.2017
Сообщений: 353
02.11.2017, 21:10  [ТС] 6
TheCalligrapher, спасибо! Только как это получается, что можно результаты сравнения еще раз сравнивать?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4772 / 2429 / 679
Регистрация: 18.10.2014
Сообщений: 4,150
02.11.2017, 21:11 7
Как правильно заметил Colt_11 выше, для булевских значений (или для 0/1) xor - это просто !=.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Только как это получается, что можно результаты сравнения еще раз сравнивать?
Не понимаю, откуда возникает такой вопрос. Результат сравнения в С++ - это значение типа bool. Значения типа bool всегда можно было сравнивать.
0
Etyuhibosecyu
4 / 7 / 4
Регистрация: 13.07.2017
Сообщений: 353
02.11.2017, 21:13  [ТС] 8
TheCalligrapher, проблема вот в чем: результаты сравнения - какие-либо переменные или константы?
0
New man
212 / 140 / 56
Регистрация: 23.05.2011
Сообщений: 740
Завершенные тесты: 4
02.11.2017, 21:13 9
Хм, таки он не подходит, когда используется целое число как логическое значение (0 — ложь, а вот 1 и 100 — истина). Битовый xor даёт true, что неправильно. Но есть решение: !a^!b
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
 
int main()
{
    int a,b,c;
    using namespace std;
    cin>>a>>b>>c;
    if(a^b)
        cout<<"a^b is true\n";
    else
        cout<<"a^b is false\n";
    
    if (a^c)
        cout<<"a^c is true\n";
    else
        cout<<"a^c is false\n";
    if (!a^!b)
        cout<<"!a^!b is true\n";
    else
        cout<<"!a^!b is false\n";
}
Выполнение:
Код
#include <iostream>
#include <string>

int main()
{
    int a,b,c;
    using namespace std;
    cin>>a>>b>>c;
    if(a^b)
        cout<<"a^b is true\n";
    else
        cout<<"a^b is false\n";
    
    if (a^c)
        cout<<"a^c is true\n";
    else
        cout<<"a^c is false\n";
    if (!a^!b)
        cout<<"!a^!b is true\n";
    else
        cout<<"!a^!b is false\n";
}
Как видите, в варианте с предварительным отрицанием обоих операндов всё ок.
0
Etyuhibosecyu
4 / 7 / 4
Регистрация: 13.07.2017
Сообщений: 353
02.11.2017, 21:14  [ТС] 10
TheCalligrapher, простите, не прочитал. Я не умею одновременно писать и читать с такой скоростью. Спасибо.
0
New man
212 / 140 / 56
Регистрация: 23.05.2011
Сообщений: 740
Завершенные тесты: 4
02.11.2017, 21:26 11
Опять же, !a ^ !b лучше, чем a!=b, так как первый вариант даст ложь при 4 и 1, а второй даст истину.

Добавлено через 2 минуты
Кстати, для чисто логических значений нет разницы между ^ и !=, так как там значения отличаются только на один бит.
Но во многих программах на C++ в качестве условий используются числа, поэтому стоит быть осторожнее.

Добавлено через 1 минуту
Мой вариант работает на том, что результат операции ! всегда равен либо 1, либо 0, точно так же, как и вообще любых логических операций.

Добавлено через 1 минуту
Ну, и not A xor not B == A xor B по свойству логических операций.

Добавлено через 4 минуты
Упс, я накосячил с постом, где выполнение.

Там было так:
Код
1 2 0
a^b is true
a^c is true
!a^!b is false
0
02.11.2017, 21:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2017, 21:26

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

Сочетания оператора цикла и условного оператора
вывести на экран все числа a от до b , кратные некоторому числу c

сочетания оператора цикла и условного оператора
Известна оценка каждого ученика по физике, посчитать сколько пятерок,...


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

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

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