首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用算术/位运算符实现关系运算符

用算术/位运算符实现关系运算符
EN

Stack Overflow用户
提问于 2013-12-12 19:24:19
回答 2查看 170关注 0票数 1

假设:

  • 双补形式的32位有符号整数
  • truefalse是值为10的整数。
  • java运算符

您能否仅使用算术运算符和按位运算符来实现关系运算符,如<==

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-12 19:47:14

这是一个快速的尝试。签名比杂乱,但可能在32位算术,如果需要。

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2013-12-12 19:31:48

我认为小于/大于可以通过从另一个减去一个,转换为一个无符号int,然后按位使用符号位,然后将它移到最不重要的位来实现。

等式可以用二进制数来实现,而不是减去两个数字的结果。还没有测试过这些,但是几年前在OpenCL中使用了类似的方法来防止GPU上的分支。

例如大于:

代码语言:javascript
复制
#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);


}

(代码页)

比类似的方法做的要少。平等:

代码语言:javascript
复制
#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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20552377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档