2015-04-27 3 views
1

У меня есть два char «с, s1 и s2 и есть заявлениеЕсть ли способ оптимизировать это утверждение?

if ((s1 && !s2) || (!s1 && s2)) 

, но я чувствую, что является излишним, поскольку расчет предполагает, глядя на обоих s1 и !s1 отдельно, и то же самое для s2 и !s2. Для, глядя на s1 и s2, у вас уже есть информация, которая лежит в основе !s1 и !s2. Есть ли способ сжать это утверждение?

+1

Есть 's1' и' s2' bools или ints? Если они являются ints, являются ли они какой-либо стоимостью или ограничены только 0 или 1? – JS1

+0

Они '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Я должен был упомянуть об этом. Сожалею. –

+1

'!! s1! = !! s2'? –

ответ

6

Это утверждение является логико-исключающее или для которых нет встроенного оператора. При определенных ограничениях, вы можете преобразовать его в побитовое-исключающее или ^, но в более общем плане она может быть записана в виде

if (!s1 != !s2) 

Логическим not оператора ! будет преобразовывать 0 до логического true значения, и преобразует любое другое значение для логического значения false. Затем результаты могут быть протестированы с помощью !=.

+1

Это работает. Логический XOR также можно записать так: 's1^!! s2' –

+0

@BarmakShemirani: Или просто'! S1 ^! S2'. – caf

+0

Почему бы не просто s1^s2? Просто для меня, чтобы знать ... Разве это не всегда работает? Что вы подразумеваете под «под определенными ограничениями»? –

1

Похоже, вы пытаетесь сделать XOR (эксклюзивный ИЛИ). Одна или другая переменная истинна, но не обе или ни одна. В языках C это делается с

bool c = a^b 
+0

bool не в каждом C, –

+0

Downvote, потому что побитовые операторы не должны использоваться в логическом контексте. Вопрос о том, что переменные имеют тип 'char'. – user694733

+0

@GrijeshChauhan Он находится в стандартном C. Это помечено C, поэтому подразумевается, что он подразумевает текущий стандарт (ISO 9899: 2011), а не старые, отозванные стандарты. – Lundin

2

Если оба являются логическими:

if(s1 != s2) 
+0

В комментариях упоминалось, что они являются 'char''s –

+0

Все, что булево в C. – Levi

5

Я считаю, что использование оператора conditional operator?: было бы проще всего прочитать.

if (s1? !s2: s2) { 
} 
Смежные вопросы