Я не понимаю, почему вы не можете использовать operator !=
:
int eval_not_equal(int x, int y) {
return x != y;
}
, но если это какая-то проблема, чтобы избежать !=
в коде, то вы можете написать так:
int eval_not_equal(int x, int y) {
return !!(x ^ y);
}
В приведенном выше коде результат x ^ y
обрабатывается как bool, а затем отрицается. Булевский эквивалент «ложь» равен 0; "true" по умолчанию равно 1 (но на самом деле любое ненулевое целое число равно true)
Если это C ++ или использование stdbool разрешено (C99), то вы также можете сделать следующее:
int eval_not_equal(int x, int y) {
return (bool) (x ^ y);
}
Обновление:
Вопрос состоял в том, чтобы построить функцию! = С использованием только побитовых операций
Если «только» является ключом, то ни мои предыдущие ответы, ни решение OP не действительны, потому что !
является логическим оператором , а не побитовым. То же относится и к типу cast (bool)
или if
.
По моему честному мнению, следующий код является нелепым, но он использует только побитовые операции:
int eval_not_equal(int x, int y) {
int xo = (x ^ y);
return (xo >> (ffs(xo) - 1)) & 1;
}
Function ffs()
возвращает первый установленный бит, т. Е. Индекс первого бита, равный 1. Нам нужен только этот бит, поэтому мы смещаем вправо результат xor на ffs - 1
, чтобы избавиться от всех младших битов, а затем делаем побитовые и с -1 для сброса старших бит.