Uygun manuel mantıksal XOR uygulaması, diğer mantıksal operatörlerin ( ||
ve &&
) XOR'nuzla genel davranışını ne kadar taklit etmek istediğinize bağlıdır . Bu operatörler hakkında iki önemli şey vardır: 1) kısa devre değerlendirmesini garanti ederler, 2) bir dizi noktası eklerler, 3) işlenenlerini yalnızca bir kez değerlendirirler.
Anladığınız gibi XOR değerlendirmesi kısa devre yapılamaz çünkü sonuç her zaman her iki işlenene de bağlıdır. Yani 1 söz konusu değil. Peki ya 2? 2'yi umursamıyorsanız, normalleştirilmiş (yani bool
) değerlerle operatör !=
XOR'un işini sonuç olarak yapar. Ve işlenenler !
gerekirse tekli ile kolayca normalleştirilebilir . Böylece !A != !B
bu konuda uygun XOR'u uygular.
Ancak, ekstra dizi noktasını önemsiyorsanız, !=
XOR'u ^
uygulamak için uygun yol ne de bitsel değildir . XOR (a, b) 'yi doğru yapmanın olası bir yolu aşağıdaki gibi görünebilir
a ? !b : b
Bu "benzer" bir ev yapımı XOR yapmaya alabilirsiniz kadar yakın aslında ||
ve &&
. Bu, elbette, yalnızca XOR'nuzu bir makro olarak uygularsanız çalışır. Sıralama işlevi işlevin bağımsız değişkenlerine uygulanmayacağından işlev çalışmaz.
Birisi her bir sekans noktası olmasının tek nedeni bu olsa diyebilirsiniz &&
ve ||
bir kısa devre değerlendirmesini destekleyen ve böylece XOR birini gerekmez. Bu aslında mantıklı. Yine de, ortada bir sekans noktası olan bir XOR'a sahip olmayı düşünmeye değer. Örneğin, aşağıdaki ifade
++x > 1 && x < 5
(en az sekanslama ile ilgili olarak) C / C ++ 'da davranış ve spesifik sonuç tanımlamıştır. Dolayısıyla, kullanıcı tanımlı mantıksal XOR'dan aynı şekilde makul bir şekilde beklenebilir .
XOR(++x > 1, x < 5)
Bir süre !=
tabanlı XOR bu özelliği yoktur.