use*_*rbb 3 c++ algorithm bignum
我有两个32位变量存储的大数字,时间(微秒).我需要一个帮助,如何将微秒时间改为毫秒,所以我可以存储32位数的差异结果.
更多细节:我有两次32位变量.其中一个变量具有更高有效位,而另一个变量具有更少有效位.这个时间有微秒分辨率,所以我想把它改成毫秒.那么如何划分存储在两个变量中的数字.
如果您没有64位类型,则可以执行以下操作:
uint32_t higher, lower; // your input
lower /= 1000;
lower += (higher % 1000) * 4294967L; // approximate 2^32 / 1000
higher /= 1000;
Run Code Online (Sandbox Code Playgroud)
如果结果适合lower自己,higher应该是0.
请注意,正如@Mikhail指出的那样,这个解决方案是近似的,并且有一个0.296 * higher + 2ms 的错误(除非我遗漏了什么).
如果你真的想要更高的精度并且不关心效率,你可以在中间使用一些浮点运算,并正确地舍入结果.我怀疑这是否值得付出努力:
uint32_t higher, lower; // your input
// simpler without a helper variable
if (lower % 1000 >= 500)
{
lower /= 1000;
++lower;
}
else
lower /= 1000;
lower += round((higher % 1000) * 4294967.296); // 2^32 / 1000
higher /= 1000;
Run Code Online (Sandbox Code Playgroud)
你需要include <cmath>的round().
需要注意的是,@ Mikhail在这种情况下的解决方案可能更好,可能更快.虽然这对我来说太复杂了.
如果您具有64位类型,则可以将拆分值转换为它:
uint64_t whole_number = higher;
whole_number <<= 32;
whole_number |= lower;
Run Code Online (Sandbox Code Playgroud)
然后你可以whole_number照常使用.
请注意,如果您只需要差异,则在实际分割之前减去这些值会更快.
假设您知道哪个值更大:
uint32_t higher1, lower1; // smaller value
uint32_t higher2, lower2; // bigger value
uint32_t del_high = higher2 - higher1;
uint32_t del_low = lower2 - lower1;
if (lower2 < lower1)
--del_high;
Run Code Online (Sandbox Code Playgroud)
现在你可以像之前解释的那样转换结果.或用一点点运气,del_high将是0(如果差值小于2 ^ 32微秒),你将有结果del_low(以微秒).