[C++] Hur fungerar xor med flera värden?

Permalänk

[C++] Hur fungerar xor med flera värden?

Hur fungerar xor med fler än två variabler?
Nedanstående kod returnerar 1 oavsett vilka värden jag använder:

#include <iostream>
using namespace std;
int main()
{
unsigned short a = 4;
unsigned short b = 6;
unsigned short c = 4;

cout << bool(a ^ b ^ c) << endl;
cin.get();
return 0;
}

Min tanke var att jag skulle få 0 om två värden var lika, men så verkar det inte vara.
Tacksam för hjälp

Permalänk
Medlem

Först och främst ger xor bara true om två bool värden (även bits) är olika och dit test blir (a^b)^c så c testas mot resultatet av a^b inte mot de andra värdena. Du får dela up testet och det är enklare med != eller == bättre men om du måste använda xor så kan du göra
cout << !(!(a ^ c) || !(a ^ c) || !(b ^ c)) << endl;
vilket ger dig 0 om minst två av värdena är lika

Permalänk
Medlem

^ i C++ är bitvis xor, och är en vänster-associativ operator. Så a ^ b ^ c evalueras som (a ^ b) ^ c, vilket ger:

4 ^ 6 = 2 2 ^ 4 = 6 bool(6) = true

Permalänk
Medlem

XOR (^) arbetar från vänster till höger, så a ^ b ^ c är det samma som att skriva (a ^ b) ^ c. XOR arbetar på bitnivå och ger följande resultat på bitar:

1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0

Så det som händer i din kod är följande

a = c = 4 (bas 10) = 0100(bas 2)
b = 6(bas 10) = 0110(bas 2)

a ^ b: 0100 ^ 0110 ------ 0010 (a ^ b) ^ c: 0010 ^ 0100 ------ 0110

Därefter typomvandlar du resultatet till bool vilket betyder att allt som inte är 0 är sant och därmed blir resultatet 1

Permalänk

Tack för hjälpen allihop!
Har inte programmerat på ett tag.
Får ta och öva helt enkelt.