我想直接计算这个函数,但到目前为止,这个技巧已经没有了:
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
的倍数。这应该是最终的(没有环绕或任何奇怪的),因为a
和b
是奇数和a >= b
。
如果是“递减1”而不是2,答案就是简单的%
...
在这种情况下性能很重要(例如,避免不可预测的分支会很好)。
答案 0 :(得分: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;
}
我不会给你一个特定的微优化版本,因为这是你应该在你的应用程序环境中真正描述自己的东西。