Я сейчас работаю над мобильной версией веб-сайта, все отлично, отлично работает на iPhone, Blackberry и Android.
У меня есть одна небольшая проблема, не большая проблема, но все же немного раздражающая , У меня есть: теги
, настроенные на 18 пикселей, и теги
, установленные на 12 пикселей, и теги
, установленные на 12 пикселей и нормальные
Теперь на iPhone все выглядит великолепно при просмотре в портретной ориентации, но при повороте устройства на альбомную Какой самый простой способ сделать трехстороннее исключающее ИЛИ? Другими словами, у меня есть три значения, и я хочу утверждение, которое оценивает только истинный IFF ] одно из трех значений является истинным. До сих пор я придумал следующее: ((a ^ b) && (a ^ c) &&! (b && c) ) || ((b ^ a) && (b ^ c) &&! (a && c)) || ((c ^ a) && (c ^ b) &&! (a && b)) Есть ли что-то попроще, чтобы сделать то же самое? Вот доказательство того, что вышеупомянутое выполняет задачу: < и я хочу утверждение, которое оценивает как истинное значение IFF, только одно из трех значений является истинным. Пока что это ...
a = true; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = false; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
Ровно для трех терминов вы можете использовать это выражение:
(a ^ b ^ c) && !(a && b && c)
Первая часть истина
, если один или три из терминов истинны
. Вторая часть выражения гарантирует, что не все три истинны
.
Обратите внимание, что приведенное выше выражение НЕ обобщает на большее количество терминов. Более общее решение состоит в том, чтобы на самом деле подсчитать , сколько членов истинно
, то есть примерно так:
int trueCount =
(a ? 1 : 0) +
(b ? 1 : 0) +
(c ? 1 : 0) +
... // more terms as necessary
return (trueCount == 1); // or some range check expression etc
a^b^c
является 1, только если нечетное число переменных равно 1 (две "1" отменяют друг друга). Поэтому нужно просто проверить случай "все три равны 1":
result = (a^b^c) && !(a&&b&&c)
Другая возможность:
a ? !b && !c : b ^ c
которая на 9 символов короче принятого ответа :)
Вот общая реализация, которая быстро дает сбой, когда более одного bool
оказывается true
.
Использование:
XOR(a, b, c);
Код:
public static bool XOR(params bool[] bools)
{
return bools.Where(b => b).AssertCount(1);
}
public static bool AssertCount<T>(this IEnumerable<T> source, int countToAssert)
{
int count = 0;
foreach (var t in source)
{
if (++count > countToAssert) return false;
}
return count == countToAssert;
}