我在接受采访时接受了这个问题来描述评论中的输出。
unsigned int d2(unsigned int a)
{
__int64 q = (__int64)a * 0x0AAAAAAAB; // (2^33+1) / 3
return (unsigned int)(q >> 33);
}
我已经在Stackoverflow中检查了与除以3相关的其他问题,但没有一个看起来如此快速和小。 任何人都可以帮我解释一下函数是如何在注释中写出输出的吗?
答案 0 :(得分:10)
该函数将32位无符号数除以3。
如果乘以2 ^ 33然后除以2 ^ 33(通过右移),则得到原始数字。但如果你乘以(2 ^ 33)/ 3然后除以2 ^ 33,你实际上除以3。
最后一位数字为B
而不是A
,以便将结果四舍五入。
没有必要在代码中实际编写它,因为编译器通常会为您执行此操作。 Try it and see.(此外,对于带符号的输入,编译器可以安全地生成带符号的右移,但C语言没有定义这样的操作。)