这个奇怪的函数可以直接计算吗?

标签 c math optimization

我想直接计算这个函数,但到目前为止我还没有找到这个技巧:

uint8_t distance(uint64_t a, uint8_t b) {
    // a and b both odd, a at least as large as b 
    assert((a & 1) && (b & 1) && a >= b);  
    // really dumb, keep subtracting 2 until you hit a multiple of b
    uint64_t distance = 0;
    while (a % b != 0) {
        distance++;
        a -= 2;
    }
    assert(distance <= 255);
    return (uint8_t)distance;
}

基本上,返回值是 a 必须减 2 多少次才能成为 b 的倍数。这最终应该是真的(没有环绕或任何奇怪的东西)因为 ab 是奇数并且 a >= b

如果它是“减 1”而不是减 2,答案将是一个简单的 %...

在这种情况下性能很重要(因此例如避免不可预测的分支会很好)。

最佳答案

如果 a % b 是偶数,则结果为 (a % b)/2。否则,它是 (a % b + b)/2。如果你愿意,你可以对此进行微优化,但一个简单的实现是

if ((a % b) % 2 == 0) {
    return (a % b) / 2;
} else {
    return (a % b + b) / 2;
}

我不会给你一个特定的微优化版本,因为那是你应该在你的应用程序上下文中真正描述自己的东西。

关于这个奇怪的函数可以直接计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45260163/

相关文章:

c++ - 为什么预分配函数指针的性能比分支差?

c - 简单的 hello world 运行但 printf 不打印到命令行

c - 当最大天数小于到期前警告天数时,pam_acct_mgmt 出现段错误

java - 将一个三角形转换为另一个三角形

python - 在特定给定点(不是 0,0,0)周围的特定半径的球体内生成一个点 - Python

java - C++ vs Java 速度(带算术的循环)

Python scipy 优化未找到最小值

c - 有多少递归函数调用导致堆栈溢出?

c - 输出相同但条件 a[3] 和 3[a] 不同

python - 欧拉计划 - 问题 160