c++ - 没有逻辑运算符的舍入整数除法

标签 c++ c rounding

我想要一个函数

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 位值)并且没有逻辑运算符(例如 )来实现这个家伙?: , &&, ...?有可能吗?

我之所以想避免使用逻辑运算符,是因为我必须为其实现此功能的处理器没有条件指令 ( more about missing conditional instructions on ARM.)。

最佳答案

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 的补码和符号幅度,因为所有运算都是数学运算。

关于c++ - 没有逻辑运算符的舍入整数除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34906413/

相关文章:

c++ - 在 boost 中使用 scoped try_shared_lock 和升级锁的例子

c++ - 铛整洁用static_cast替换reinterpret_cast

c++ - C++标准应该如何使用

C# Pulled Json Double-Values 添加异常?

c++ - 我们应该在取消注册时删除观察者吗?

c - 在 c 中通过 strtok 读取文件并标记化

有人可以帮我确定 C 中 Seg 错误的原因以及 gdb 输出的含义吗?

c - 如何在 C 中创建两个同时运行的无限循环?

python - 如何舍入日期时间对象的分钟

Python - 将 float 四舍五入为整数的最佳方法是什么