【发布时间】:2018-03-05 00:33:50
【问题描述】:
我有一个 32 位定时器,我想在 n 步后溢出。这意味着每个步骤应该是 (2^32)/n。但是,如果我尝试使用 32 位整数来计算这个数字,编译器会抱怨 (1
我可以通过执行 (~0)/n 之类的操作来非常接近我正在寻找的答案。但是,让我感到困扰的是,在这种情况下,当 n 是 2 的幂时,我不会得到正确的答案,这意味着在这些情况下,计时器溢出需要额外的一步。
有没有只使用 32 位整数计算 (2^32)/n 的简单表达式?
【问题讨论】:
-
你想如何对结果进行四舍五入?如果您向 0 舍入,则计时器将在 n=3 的第 4 步溢出。
-
(2^32)/n = 2*((2^31)/n)
-
@ScottHunter - 不使用整数运算。例如。 (2^32)/3 = 1431655765 2*((2^31)/3) = 1431655764。
-
@user2357112 公平点。我想我想四舍五入,或者计算 (2^32+n-1)/n。
-
这看起来像XY-problem:要尽可能均匀地分布步骤并且接近 2^32 到零,请查看 Bresenham's algorithm。