c - 没有除法运算符的除以 3

标签 c numbers

我在面试中被问到这个问题以描述评论中的输出。

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/

相关文章:

c - 为什么/何时为 C 字符串包含终止符 '\0'?

c - 带负值的 Unsigned long long

python-3.x - 如何高效地找到适当因子的多重性?

numbers - 无符号数的上溢/下溢

php - 在 PHP 中检查字符串是否以数字开头

c - 在 linux 中实现 ls -R 命令

c - 如何在 C 中将 uint 转换为 int 且结果范围损失最小

javascript - 获取 2+ 位数字中 n 位数字的个数

c - 旋转窗口的工具,如 cvmovewindow

angular - 如果指令太高,请替换输入数字上的数字