我知道大多数算术运算只能使用按位运算符(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位)
答案 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>
特征,模板版本可以正常工作。