Не равны с помощью побитовых операций? - PullRequest
2 голосов
/ 24 февраля 2020

Я буду прямо об этом: этот - для домашней работы. Однако, так как я уже закончил вопрос и мне просто было любопытно узнать о различных реализациях того, что я сделал, я подумал, что можно посоветоваться с вами.

Вопрос состоял в том, чтобы построить функцию !=, используя побитовые операции. Нам также разрешено использовать ! и +.

Возвращает 0, если x==y, в противном случае возвращается 1.

int eval_not_equal(int x, int y) {
    int result = x ^ y;
    if(result == 0) {
        result = 0;
    }
    else {
       result = 1; 
     }
    return result;
}

Я думаю, что это прекрасный ответ на вопрос, но мне было интересно, возможно ли это сделать без использования if? Есть довольно много различных побитовых операций, и я уверен, что должен быть способ использовать их, чтобы заменить if, который я использовал!

Хотелось бы узнать, что вы, ребята, думаете! :-)

Ответы [ 2 ]

4 голосов
/ 24 февраля 2020

Я не понимаю, почему вы не можете использовать 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 для сброса старших бит.

0 голосов
/ 24 февраля 2020

Вы можете просто сделать следующее:

return !(x ^ y);
...