Проблема размера шрифта с iPhone

Я сейчас работаю над мобильной версией веб-сайта, все отлично, отлично работает на iPhone, Blackberry и Android.

У меня есть одна небольшая проблема, не большая проблема, но все же немного раздражающая , У меня есть: теги

, настроенные на 18 пикселей, и теги

, установленные на 12 пикселей, и теги

, установленные на 12 пикселей и нормальные

Теперь на iPhone все выглядит великолепно при просмотре в портретной ориентации, но при повороте устройства на альбомную < и я хочу утверждение, которое оценивает как истинное значение IFF, только одно из трех значений является истинным. Пока что это ...

Какой самый простой способ сделать трехстороннее исключающее ИЛИ?

Другими словами, у меня есть три значения, и я хочу утверждение, которое оценивает только истинный IFF ] одно из трех значений является истинным.

До сих пор я придумал следующее:

((a ^ b) && (a ^ c) &&! (b && c) ) || ((b ^ a) && (b ^ c) &&! (a && c)) || ((c ^ a) && (c ^ b) &&! (a && b))

Есть ли что-то попроще, чтобы сделать то же самое?


Вот доказательство того, что вышеупомянутое выполняет задачу:

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

34
задан polygenelubricants 12 August 2010 в 14:59
поделиться

5 ответов

Ровно для трех терминов вы можете использовать это выражение:

(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
43
ответ дан 27 November 2019 в 16:29
поделиться
bool result = (a?1:0)+(b?1:0)+(c?1:0) == 1;
13
ответ дан 27 November 2019 в 16:29
поделиться

a^b^c является 1, только если нечетное число переменных равно 1 (две "1" отменяют друг друга). Поэтому нужно просто проверить случай "все три равны 1":

result = (a^b^c) && !(a&&b&&c)
9
ответ дан 27 November 2019 в 16:29
поделиться

Другая возможность:

a ? !b && !c : b ^ c

которая на 9 символов короче принятого ответа :)

6
ответ дан 27 November 2019 в 16:29
поделиться

Вот общая реализация, которая быстро дает сбой, когда более одного 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;
}
1
ответ дан 27 November 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: