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

不带逻辑运算符的舍入整数除法

宰父深
2023-03-14

我想要一个函数

int rounded_division(const int a, const int b) { 
    return round(1.0 * a/b); 
}

例如,我们有,

rounded_division(3, 2) // = 2
rounded_division(2, 2) // = 1
rounded_division(1, 2) // = 1
rounded_division(0, 2) // = 0
rounded_division(-1, 2) // = -1
rounded_division(-2, 2) // = -1
rounded_division(-3, -2) // = 2

或者在代码中,其中 ab 是 32 位有符号整数:

int rounded_division(const int a, const int b) {
    return ((a < 0) ^ (b < 0)) ? ((a - b / 2) / b) : ((a + b / 2) / b);
}

这里有一个棘手的部分:如何有效地实现这一功能(不使用更大的64位值),并且不使用诸如之类的逻辑运算符 ,<代码>

我想避免逻辑运算符的原因是,因为我必须为其实现此功能的处理器没有条件指令(更多关于ARM上缺少条件指令的信息)。


共有3个答案

徐晔
2023-03-14

怎么样

  ...
  return ((a + (a*b)/abs(a*b) * b / 2) / b);
}

没有溢出:

  ...
  return ((a + ((a/abs(a))*(b/abs(b))) * b / 2) / b);    
}
濮阳浩穰
2023-03-14

这个怎么样?

int rounded_division(const int a, const int b) {
    return (a + b/2 + b * ((a^b) >> 31))/b;
}

<代码>(a^b)

编辑

正如@chux在他的评论中指出的,由于整数除法,这个方法是错误的。这个新版本的评估与OP的示例相同,但包含更多的操作。

int rounded_division(const int a, const int b) {
    return (a + b * (1 + 2 * ((a^b) >> 31)) / 2)/b;
}

然而,这个版本仍然没有考虑溢出问题。

温成济
2023-03-14

a/b a%b/(b/2 b%2)工作得很好-在十亿个测试用例中没有失败。它满足了所有OP的目标:没有溢出,没有long long,没有分支,在定义a/b时在整个int范围内工作。

没有32位依赖项。如果使用C99或更高版本,则没有实现行为限制。

int rounded_division(int a, int b) {
  int q = a / b;
  int r = a % b;
  return q + r/(b/2 + b%2);
}

这适用于2的补码、1的补码和符号大小,因为所有操作都是数学运算。

 类似资料:
  • JavaScript 中有三个逻辑运算符:||(或),&&(与),!(非)。 虽然它们被称为“逻辑”运算符,但这些运算符却可以被应用于任意类型的值,而不仅仅是布尔值。它们的结果也同样可以是任意类型。 让我们来详细看一下。 ||(或) 两个竖线符号表示“或”运算符: result = a || b; 在传统的编程中,逻辑或仅能够操作布尔值。如果参与运算的任意一个参数为 true,返回的结果就为 tr

  • 主要内容:逻辑非运算(NOT 或者 !),逻辑与运算符(AND 或者 &&),逻辑或运算符(OR 或者 ||),异或运算(XOR 运算符)逻辑运算符又称为布尔运算符,用来确定表达式的真和假。 MySQL中支持的逻辑运算符如下表所示。 MySQL 中的逻辑运算符 运算符 作用 NOT 或者 ! 逻辑非 AND 或者 && 逻辑与 OR 和 || 逻辑或 XOR 逻辑异或   下面分别讨论 MySQL 逻辑运算符的使用方法。 逻辑非运算(NOT 或者 !) 和 都是逻辑非运算符,返回和操作数相反的结

  • 主要内容:打脸某些 Python 教程,逻辑运算符的本质高中数学中我们就学过逻辑运算,例如 p 为真命题,q 为假命题,那么“p且q”为假,“p或q”为真,“非q”为真。 Python 也有类似的逻辑运算,请看下表: 表 1 Python 逻辑运算符及功能 逻辑运算符 含义 基本格式 说明 and 逻辑与运算,等价于数学中的“且” a and b 当 a 和 b 两个表达式都为真时,a and b 的结果才为真,否则为假。 or 逻辑或运算,等价于数学

  • 逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。 逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,具体如表 1 所示。 表 1 逻辑运算符的用法、含义及实例 运算符 用法 含义 说明 实例 结果 && a&&b 短路与 ab 全为 true 时,计算结果为 true,否则为 false。 2>1&&3<4

  • 问题内容: 我记得有一阵子关于逻辑运算符的内容,在的情况下,使用要比(或反之亦然)更好。 当我回到项目中时,我只需要在项目中使用它,但是我不记得建议使用哪个运算符,或者它是否正确。 哪个更好?为什么? 问题答案: 没有“更好的”,但是更常见的是。它们具有不同的优先级, 并且可以像通常期望的那样工作。 另请参阅:逻辑运算符( 以下示例从此处获取 ):

  • 前面只介绍了courter<=10、total>1000 和 number!=sentinel Value 之类的简单条件(simplecondition)。我们用关系运算符>、<、>=、<=和相等运算符==、!=表示这些条件。每个判断只测试一个条件。要在每个判断中测试多个条件,可以在不同语句中或嵌套if(if/else)结构中进行这些测试。 C++提供的逻辑运算符(logical operato