我在面试中被问到这个问题以描述评论中的输出。
unsigned int d2(unsigned int a)
{
__int64 q = (__int64)a * 0x0AAAAAAAB; // (2^33+1) / 3
return (unsigned int)(q >> 33);
}
我已经检查了 Stackoverflow 中与除以 3 相关的其他问题,但似乎没有一个如此快速和小。 任何人都可以帮助我解释该函数如何给出注释中的输出吗?
最佳答案
该函数将一个 32 位无符号数除以 3。
如果乘以 2^33,然后除以 2^33(右移),则得到原始数字。但是,如果您乘以 (2^33)/3,然后除以 2^33,则实际上是除以三。
最后一位是 B
而不是 A
导致结果向上舍入。
没有必要在你的代码中实际写这个,因为编译器通常会为你做这件事。 Try it and see. (此外,对于带符号的输入,编译器可以安全地生成带符号的右移,但 C 语言没有定义这样的操作。)
关于c - 没有除法运算符的除以 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20450643/