Одно и только одно нулевое сравнение с наименьшим количеством операций - PullRequest
1 голос
/ 05 февраля 2020

Это может быть глупый вопрос, но в какой-то функции у меня есть два int с, и мне нужно сравнить их, чтобы найти if, точно один из них ==0 ... Оба способа я придумал с требуется 5 логических операций, и я не могу придумать ничего более короткого ... Есть более короткий путь?

Я придумал:

int x, y;

if (((x==0) || (y==0)) && (x != y)){} // most obvious option, or:

if (((x^y) == x) ^ ((x^y) == y)){} // looks better, but still 5 ops

1 Ответ

3 голосов
/ 05 февраля 2020

Выражение ((x^y) == x) ^ ((x^y) == y) может быть упрощено простым способом.

(x^y) == x тогда и только тогда, когда y == 0, и аналогично (x^y) == y тогда и только тогда, когда y == 0. Таким образом, следующее использует три операции для вычисления условия:

if((x == 0) ^ (y == 0)) {
    // ...
}

Это имеет смысл, потому что при использовании XOR в качестве логического оператора, результат будет истинным, если и только если один, но не оба из операндов истинны. Таким образом, это напрямую проверяет, являются ли истинными один, но не оба из x == 0 и y == 0.

...