【发布时间】:2019-08-29 03:17:27
【问题描述】:
如何计算整数除法,264/n?假设:
-
unsigned long是 64 位 - 我们使用 64 位 CPU
- 1 64
如果我们执行18446744073709551616ul / n,我们会在编译时得到warning: integer constant is too large for its type。这是因为我们无法在 64 位 CPU 中表达 264。另一种方法如下:
#define IS_POWER_OF_TWO(x) ((x & (x - 1)) == 0)
unsigned long q = 18446744073709551615ul / n;
if (IS_POWER_OF_TWO(n))
return q + 1;
else
return q;
有更快(CPU 周期)或更简洁(编码)的实现吗?
【问题讨论】:
-
128 位当然可以。或者,您可以尝试使用双除法...
-
如果你的编译器有
__int128,那么干净的方法是__int128 q = ((__int128)18446744073709551615ull + 1)/n -
@mvp AFAIK,
double是 64 位的,所以我们需要 128 位四倍。 -
IEEE754 double 有 53 位
-
好像把
18446744073709551615ul写成-1ul会更好。
标签: c integer-division