LINUX.ORG.RU
ФорумTalks

Отчего и почему в сях нет логического XOR?


0

0
Вот есть бинарные И, ИЛИ, есть логические И, ИЛИ. А XOR-а логического нет! Абыдно, да? Интернеты пожимают плечами, и что-то невразумительное мычат. Может, кластер здешних анонимусов объяснит, отчего такая несправедливость?
int xor (int a, int b) { return (a || b) && (! (a && b)); }
Joe_Bishop
()
Во-первых: есть арифметические и логические И, ИЛИ итд. Что такое "бинарные" я хз. Во-вторых: xor есть
nnm
()
Ответ на: комментарий от nnm
XOR есть в виде XYZ ^ ZYX, а вот ZYX ^^ XYZ -- не. Я про это. Как реализовать этот XOR через AND, OR и NOT я знаю, непонятно, почему ^^ в язык не включили? Слишком кавайно?
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum
> XOR есть в виде XYZ ^ ZYX, а вот ZYX ^^ XYZ -- не. Я про это. Как реализовать этот XOR через AND, OR и NOT я знаю, непонятно, почему ^^ в язык не включили? Слишком кавайно?

Так логический и побитный XOR - одно и то же.

Dendy ★★★★★
()
Ответ на: комментарий от nnm
Про арифметические и логические: сейчас вспомнил чем различаются сдвиги. А чем различаются арифм. и лог. И, ИЛИ итд?
nnm
()
Ответ на: комментарий от Dendy
> Так логический и побитный XOR - одно и то же.

Так GCC, например, не согласен.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от nnm
Ну, если логическое -- то смотрится, труё или фальсе каждый операнд, и на основании этого выкидывается результат -- тоже труё или фальсе. А при арифметическом функция (OR, AND etc...) применяется побитно к операндам.
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от nnm
> А чем различаются арифм. и лог. И, ИЛИ итд?

Логические сначала неявно преобразовываются в bool. А так - ничем.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy
> Так логический и побитный XOR - одно и то же.

хрен там одно и то же

int a = 1; int b = 2; int c = a ^ b; int d = a ^^ b;

c и d будут иметь разные значения по идее, если бы логический xor был

anonymous
()
Ответ на: комментарий от one_more_hokum
И что должен значить ЛОГИЧЕСКИЙ xor для УКАЗАТЕЛЕЙ? Честно говоря, это недалеко от буйного помешательства.
anonymous
()
Ответ на: комментарий от anonymous
> что должен значить ЛОГИЧЕСКИЙ xor для УКАЗАТЕЛЕЙ?

А ты на меня капсом не дави! Ну, это-же элементарно, Ватсон! В функцию передаются два указателя, и только один из них должен быть валидным, другой -- NULL. И оба одновременно не должны быть валидными. Вот и всё.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от Dendy
> Так логический и побитный XOR - одно и то же.

Сильное утверждение. 1 ^ 2 - не совсем равно 0, мягко говоря.

anonymous
()
Ответ на: комментарий от anonymous
> И что должен значить ЛОГИЧЕСКИЙ xor для УКАЗАТЕЛЕЙ?

Очевидно значит что только один из них проициализирован. != тут не поможет.

Dendy ★★★★★
()
Ответ на: комментарий от anonymous
> Сильное утверждение. 1 ^ 2 - не совсем равно 0, мягко говоря.

Имелось в виду когда оба параметра bool. Хотя да, быссмысленное утверждение с моей стороны.

Dendy ★★★★★
()
Ответ на: комментарий от scaldov
> это вообще-то "!="

4.2

См. пример про 1 и 2. В классическом си любой не ноль - истина. А булевского типа до С99 просто не существовало.

anonymous
()
Ответ на: комментарий от anonymous
Ну, собссно говоря, идея была такова:

class Class
{
	Struct1* str1;
	Struct2* str2;
public:
	Class(Struct1* S1,Struct2* S2)
		: (bool)S1 != (bool)S2 ? str1(S1),str2(S2) : str1(NULL),str2(NULL)
        { ; }
};

Но GCC страшно обругался на такой вариант инициализации, и всё. Договориться с ним у меня не получилось.

PS: да, я извращенец! :-)
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от anonymous
> p1 == NULL != p2 == NULL

(!p2) != (!p2)

Почти perl ;)

anonymous
()
Ответ на: комментарий от anonymous
Блин, с приоритетом я всегда косячил.
anonymous
()
Ответ на: комментарий от one_more_hokum
> Да была наивная надежда, что всё удастся сделать в списке инициализации...

Class(Struct1* S1,Struct2* S2) : str1(!S1 != !S2 ? S1, 0) , str2(!S1 != !S2 ? S2, 0) { }

Но оно надо такое? Тут проблема не в отсутствии логического XOR, а в синтаксе С++. Спискового присваивания нетуть

anonymous
()
Ответ на: комментарий от anonymous
Бля. Ч0ртово форматирование.

> Да была наивная надежда, что всё удастся сделать в списке инициализации...

Class(Struct1* S1,Struct2* S2) 
    : str1((!S1 != !S2) ? S1, 0) 
    , str2((!S1 != !S2) ? S2, 0) 
{ }

Но оно надо такое? Тут проблема не в отсутствии логического XOR, а в 
синтаксе С++. Спискового присваивания нетуть 
anonymous
()
Ответ на: комментарий от quarck
> Dendy получает двойку и отправляется на пересдачу.

Это вариант записи не претендует на самый оптимизированый и призван показать смысл XOR. != имеет другой смысл.

Dendy ★★★★★
()
Ответ на: комментарий от anonymous
А, всё, понял, где моя ошибка была. Благодарю!

Анонимусы -- страшная сила!

one_more_hokum ★★★
() автор топика
А наXOR он нужен? != не катит?
vada ★★★★★
()
Ответ на: комментарий от anonymous
> В классическом си любой не ноль - истина.

да, но все логические операции гарантированно (по стандарту) возвращают 1 в случае истины.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah
> да, но все логические операции гарантированно (по стандарту) возвращают 1 в случае истины.

Речь идет не о том чё они возвращают, а о том что они могут получать в качестве операнда.

anonymous
()
Вы будете удивлены, но в Сях нет способа вывести строковое двоичное число, типа printf("%b\n", i);
ip1981 ☆☆
()
Ответ на: комментарий от ip1981
А кого это волнует кроме вас, собственно?
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.