简单的C问题,我怎样才能正确并毫不含糊地将毫秒转换为秒。 有两个限制因素:
我需要将秒数四舍五入到最接近的秒数(1-499ms向下舍入,500-999ms向上舍入。不需要关心负值)
int mseconds = 1600; // should be converted to 2 seconds
int msec = 23487; // should be converted to 23 seconds
答案 0 :(得分:26)
这应该有效
int sec = ((msec + 500) / 1000);
答案 1 :(得分:5)
int seconds = msec / 1000;
if (msec % 1000 > 500)
seconds++;
答案 2 :(得分:4)
起初我不想在x86上测试之后写这个答案,但sparc Solaris上的测试显示它与“明显的解决方案”相比有一个性能提升,所以它可能对某人有用。我是从a PDF附带的Hacker's Delight中获取的。在这里:
unsigned msec2sec(unsigned n) {
unsigned q, r, t;
n = n + 500;
t = (n >> 7) + (n >> 8) + (n >> 12);
q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14);
q = q >> 9;
r = n - q*1000;
return q + ((r + 24) >> 10);
}
而不是:
unsigned msec2sec_obvious(unsigned n) {
return (n + 500)/1000;
}
在x86上,“明显的算法”转换为添加500然后再乘以274877907,然后从edx中获取最重要的32位并将它们向右移6位 - 所以它将这个代码击败在上面(~5)次数表现差异)。
然而,在Solaris / sparc上,“明显的”被转换为对.udiv的调用 - 总而言之,在另一个方向上的性能差异为~2.5倍。