gpt4 book ai didi

c++ - 将 2x32 位大整数除以 1000

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:09 25 4
gpt4 key购买 nike

我有很大的数字,时间(微秒)存储在两个 32 位变量中。我需要帮助,如何将微秒时间更改为毫秒,以便我可以将差异结果存储在 32 位数字中。

更多详情:我曾经有过两个 32 位变量。其中一个变量具有较高有效位而其他变量具有较低有效位。这次有微秒分辨率,所以我想把它改成毫秒。那么如何划分存储在两个变量中的数字。

最佳答案

如果你没有 64 位类型,你可以像下面这样:

uint32_t higher, lower; // your input

lower /= 1000;
lower += (higher % 1000) * 4294967L; // approximate 2^32 / 1000
higher /= 1000;

如果结果符合lower本身,higher应该是 0 .

请注意,正如@Mikhail 指出的那样,这个解决方案是近似的,并且有一个错误 0.296 * higher + 2毫秒(除非我遗漏了什么)。


如果您真的想要更高的精度并且不关心效率,您可以在中间使用一些浮点运算,并正确地舍入结果。我怀疑这是否值得付出努力:

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;

您需要 include <cmath>对于 round() .

请注意,@Mikhail 在这种情况下的解决方案可能更好,而且可能 更快。虽然这对我来说太复杂了。


如果您有 64 位类型,则可以将拆分值转换为它:

uint64_t whole_number = higher;
whole_number <<= 32;
whole_number |= lower;

然后你可以使用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;

现在您可以像之前解释的那样转换结果。或者运气好的话,del_high将是 0 (如果差异小于 2^32 μs),结果将在 del_low 中(以微秒为单位)。

关于c++ - 将 2x32 位大整数除以 1000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12120328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com