Bithacking比较(较少)运算符

时间:2015-11-18 12:38:35

标签: c++ bit-manipulation bitwise-operators bit

我知道大多数算术运算只能使用按位运算符(Add two integers using only bitwise operators?Multiplication of two integers using bitwise operators等)来完成。

我也知道,如果您拥有较少的运营商,您可以从中推断出其他运营商(Sorting only using the less-than operator compared to a trivalue compare function

所以...如果有一种方法只使用按位运算来实现less运算符,那么我只是好奇。

像:

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

并使其更复杂:

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

其中T当然是一个整数,数值类型(8 ... 64位)

1 个答案:

答案 0 :(得分:3)

当然可以做到。假设有两个补码:

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>特征,模板版本可以正常工作。