[英]Implement relational operator with arithmetic/bitwise operators
假設:
true
和false
是值為1
和0
整數 可以僅使用算術和按位運算符來實現像<
和==
這樣的關系運算符嗎?
這是一個快速嘗試。 小於號是比較麻煩的,但是如果需要,可以在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替換常規整數和long類型。
我認為小於/大於可通過以下方式實現:將另一個相減,轉換為無符號int,然后對符號位使用按位與,然后將其移至最低有效位。
可以通過對兩個數字相減的結果使用二進制NOT來實現相等。 尚未測試這些,但是幾年前在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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.