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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.