当前位置: 首页 > 知识库问答 >
问题:

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

阙项禹
2023-03-14

假设:

  • 2的补码形式的32位有符号整数
  • true和false是值为1和0的整数
  • java运算符

你能实现像<代码>

共有2个答案

古弘
2023-03-14

我认为小于/大于可以通过将一个从另一个中减去,强制转换为无符号int,然后对符号位使用按位and,然后将其移动到最低有效位来实现。

可以用二进制实现相等,而不是用两个数字相减的结果。还没有测试过这些,但多年前在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。

阎星华
2023-03-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是被要求的。不是我的母语,但我相信这里可以用正则整数和long类型代替int32\u t和int64\u t。

 类似资料:
  • 运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,覆盖了所有主要的运算。 概述 JavaScript 共提供10个算术运算符,用来完成基本的算术运算。 加法运算符:x + y 减法运算符: x - y 乘法运算符: x * y 除法运算符:x / y 指数运算符:x ** y 余数运算符:x % y 自增运算符:++x 或者 x++ 自减运算符:--x

  • 算术运算符是 SQL 中最基本的运算符, MySQL 支持的运算符包括加、减、乘、除和取余运算,它们是最常用、最简单的一类运算符。下表列出了这些运算符的作用和使用方法。 MySQL中的算术运算符 运算符 作用 使用方法 + 加法运算 用于获得一个或多个值的和 - 减法运算 用于从一个值中减去另一个值 * 乘法运算 使数字相乘,得到两个或多个值的乘积 / 除法运算,返回商 用一个值除以另一个值得到商

  • 主要内容:+ 加法运算符,- 减法运算符,*乘法运算符,/ 和 // 除法运算符,% 求余运算符,** 次方(乘方)运算符算术运算符也即数学运算符,用来对数字进行数学运算,比如加减乘除。下表列出了 Python 支持所有基本算术运算符。 表 1 Python 常用算术运算符 运算符 说明 实例 结果 + 加 12.45 + 15 27.45 - 减 4.56 - 0.26 4.3 * 乘 5 * 3.6 18.0 / 除法(和数学中的规则一样) 7 / 2 3.5 // 整除(只保留商的整数部分

  • 主要内容:一元运算符,二元运算符,算术赋值运算符运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的。 Java 语言中的运算符除了具有优先级之外,还有一个结合性的特点。当一个表达式中出现多种运算符时,执行的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的约束,以便确定是自左向右进行运算还是自右向左进行运算。这些 运算符按照操作数的数量可以分为单目运算符、双目运算符和三目运算符。 最基本的运算符包

  • EL中的算术运算符用于对整数和浮点数进行算述运算。算术运算符有5种,包括+、-、*、/(div)和%(mod),分别对应于加、减、乘、除和取余(也可以称为取模)5种运算。其中“-”既可以用作减号,也可以用作负号;“/”和“div”在进行除法运算时,无论操作数是整数,还是浮点数,运算结果都是浮点点。在使用算术运算符时应注意以下几点: l 对于这5种算术运算符,如果两个操作数都是null,则运算结果为

  • 关系运算符(relational operators)也可以称为“比较运算符”,用于用来比较判断两个变量或常量的大小。 关系运算符是二元运算符,运算结果是 boolean 型。当运算符对应的关系成立时,运算结果是 true,否则是 false。 关系表达式是由关系运算符连接起来的表达式。关系运算符中“关系”二字的含义是指一个数据与另一个数据之间的关系,这种关系只有成立与不成立两种可能情况,可以用逻