Оператор сравнения битхаков (меньше)

Мне известно, что большинство арифметических операций могут быть выполнены только с использованием побитовых операторов ( Добавить два целых числа, используя только побитовые операторы?, Умножение двух целых чисел, используя побитовые операторы, и т. Д...).

Я также знаю, что если у вас есть оператор меньше, вы можете вывести из него другие операторы ( сортировка только с использованием оператора меньше чем по сравнению с функцией сравнения трех значений)

Итак... Я просто любопытен, если есть способ реализовать оператор less, используя только побитовые операции.

Подобно:

bool less(int a, int b) { ??? }

И чтобы сделать это более сложным:

template<typename T> bool less(T a, T b) { ??? }

где T, безусловно, является целочисленным числовым типом (8 ... 64 бит)

1 ответ

Это, безусловно, можно сделать. Предполагая два дополнения:

bool less(int a, int b)
{
  const unsigned int bits = sizeof(int) * CHAR_BIT;
  const unsigned int sign_bit = 1u << (bits - 1);
  unsigned int lhs = a;
  unsigned int rhs = b;
  bool negative = (lhs & sign_bit);
  if (negative && !(rhs & sign_bit))
    return negative;
  for (unsigned int bit == 1u << (bits - 2); bit != 0u; bit >>= 1) {
    if ((lhs & bit) != (rhs & bit)) {
      return !(lhs & bit);
    }
  }
}

Версия шаблона может работать так же, с помощью соответствующего make_unsigned<T> черта характера.

Другие вопросы по тегам