可以直接计算这个奇怪的功能吗?

Bee*_*ope 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果它是"递减1"而不是2,答案就会很简单%......

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

use*_*ica 7

如果a % b是偶数,结果是(a % b) / 2.否则,就是这样(a % b + b) / 2.如果需要,您可以微观优化,但是直接实现

if ((a % b) % 2 == 0) {
    return (a % b) / 2;
} else {
    return (a % b + b) / 2;
}
Run Code Online (Sandbox Code Playgroud)

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