当前位置:  开发笔记 > 编程语言 > 正文

如何将表示使用时间的32位int转换为32位int,表示时间为秒的二进制分数?

如何解决《如何将表示使用时间的32位int转换为32位int,表示时间为秒的二进制分数?》经验,为你挑选了1个好方法。

POSIX用于struct timeval表示时间间隔.

struct timeval
{
    time_t   tv_sec;
    unsigned tv_usec;
};

GHS Integrity Time以下列方式表示:

struct Time
{
    time_t Seconds;
    unsigned Fraction;
};

例如,0.5sec表示为0x80000000,0.25sec表示为0x40000000.

什么是要转换的最佳方式timevalTime

(ps答案不是将POSIX库链接到Integrity并使用POSIX调用.)



1> Tom Alsberg..:

这是一种代表时间的不寻常方式.

无论如何,如果你有64位整数或浮点(前者更有可能在嵌入式系统上),有两种简单的方法可以做到这一点:

/* assuming long is 64-bit and int is 32-bit
   or in general long twice the size of int: */
Fraction = (long) tv_usec * UINT_MAX / 1000000        /* usecs to fraction */
tv_usec = (long) Fraction * 1000000 / UINT_MAX        /* fraction to usecs */

/* assuming floating points are available: */
Fraction = tv_usec * ((double) UINT_MAX / 1000000)    /* usecs to fraction */
tv_usec = Fraction * ((double) 1000000 / UINT_MAX)    /* fraction to usecs */

显然两者都只是整数近似,因为一个尺度中的大多数值不能在另一个尺度中表示为整数.在一个方向上,您可能会失去一些精度,因为Fraction表单可以表示更精细的时间 - Fraction表单的一个增量小于0.00024微秒.但是,只有当你的计时器能够实际测量那些不太可能的值时 - 大多数计时器甚至无法以微秒级进行测量,并且你看到的值tv_usec通常是四舍五入的.

如果64位整数和浮点都不是可用的选项,则可以使用额外变量迭代地执行.我正在考虑是否有更简单(并且更便宜,考虑到这是时序代码)的方式进行这样的缩放比做等效的迭代64位乘法和除法有两个32位整数.在我想到的两个想法中,一个人不会做出精确的均衡缩放,并且可能产生最多9位的结果,并且补偿的结果不会更便宜.如果我想到了新的东西,我会在这里发布,但这是一个有趣的挑战.有没有其他人有一个好的算法或片段?也许借助一张小型预先计算的桌子?

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有