假设:
true和false是值为1和0的整数。您能否仅使用算术运算符和按位运算符来实现关系运算符,如<和==?
发布于 2013-12-12 19:47:14
这是一个快速的尝试。签名比杂乱,但可能在32位算术,如果需要。
int32_t cmp_lt(int32_t lhs, int32_t rhs) {
int64_t tmp = lhs;
tmp -= rhs;
tmp >>= 63;
return tmp & 1;
}
int32_t cmp_eq(int32_t lhs, int32_t rhs) {
return (cmp_lt(lhs, rhs) | cmp_lt(rhs, lhs)) ^ 1;
}
// 32-bit only version
int32_t cmp_lt32(int32_t lhs, int32_t rhs) {
int32_t tmp = lhs - rhs;
// -lhs < +rhs is always true
tmp |= ~rhs & lhs;
// +lhs < -rhs is always false
tmp &= ~rhs | lhs;
tmp >>= 31;
return tmp & 1;
}编辑:我看到Java是被要求的。不是我的母语,但我相信常规的整数和长类型可以在这里替代int32_t和int64_t。
发布于 2013-12-12 19:31:48
我认为小于/大于可以通过从另一个减去一个,转换为一个无符号int,然后按位使用符号位,然后将它移到最不重要的位来实现。
等式可以用二进制数来实现,而不是减去两个数字的结果。还没有测试过这些,但是几年前在OpenCL中使用了类似的方法来防止GPU上的分支。
例如大于:
#include <stdio.h>
int main(int argc, char** argv) {
int x = 6;
int y = 4;
int diff;
unsigned int* udiff;
unsigned int gr;
unsigned int one = 1;
diff = x - y;
udiff = (unsigned int*)&diff;
gr = (*udiff & (one << 31)) >> 31;
printf("%d", gr);
}(代码页)
比类似的方法做的要少。平等:
#include <stdio.h>
int main(int argc, char** argv) {
int x = 4;
int y = 4;
int diff;
unsigned int* udiff;
unsigned int eq;
diff = x - y;
udiff = (unsigned int*)&diff;
eq = !(*udiff);
printf("%d", eq);
} (代码页)
不确定如何在Java中这样做,这取决于这样一个事实:您可以使用指针转换将有符号整值重新解释为C中的无符号int。
https://stackoverflow.com/questions/20552377
复制相似问题