我的目标是比较GPS设备提供的两个u_long时间戳。像16290212这样的长整数具有以下结构:
hhmmssμμ
以下代码段显示了如何将长整数解析为整数数组的方法。但我认为这不是很有效率。比较两个时间戳的最快方法是什么?我很想使用UNIX时间戳,但在这种情况下不可能。
u_long timestamp_old = 16290212;
u_long base = 1000000;
/* arr[0]: hours
* arr[1]: minutes
* arr[2]: seconds
* arr[3]: miliseconds */
int arr[4];
int i=0;
// parse timestamp_old
while(base >= 1)
{
arr[i++] = (timestamp_old / base);
timestamp_old = (timestamp_old % base);
base /= 100;
}
答案 0 :(得分:2)
比较两个时间戳的最快方法是什么? 我想检查差异是否小于400毫秒
也许不是最快的,但至少是一个快速最坏情况的起点。请注意,ssµµµ
与µµµµµ
相同。
int32_t GPS_to_ms(u_long timestamp) {
int32_t ms = timestamp%100000;
int32_t hhmm = timestamp / 100000;
ms += (hhmm%100)*60*1000;
int32_t hh = hhmm / 100;
ms += hh*60*60*1000;
return ms;
}
if (GPS_to_ms(timestamp_later) - GPS_to_ms(timestamp_first) < 400) {
// timestamps are in close succession.
}
为了加快平均值,1)假设timestamp_later >= timestamp_first
通常是2)时间戳通常具有相同的hhmm
bool GPS_compare_400(u_long first, u_long later) {
int32_t ms1 = first%100000;
int32_t hhmm1 = first/100000;
int32_t ms2 = later%100000;
int32_t hhmm2 = later/100000;
if (hhmm1 == hhmm2) {
return ms2 - ms1 < 400;
}
return GPS_to_ms(timestamp_later) - GPS_to_ms(timestamp_first) < 400;
}
答案 1 :(得分:0)
我假设输入是“hhmmssμμμ”形式的字符串gpstime
。我假设总是存在尾随零,这样微秒部分总是有三个数字。
1
int h, m, s, us;
double t;
if(sscanf(gpstime, "%2d%2d%2d%3d", &h, &m, &s, &us) == 4)
t = (h * 60L + m) * 60 + s + us/1000.;
else {
/* parse error */
t = 0;
}
如果这还不够有效,那么这里就是肮脏的,回避scanf
:
2
#define Ctod(c) ((c) - '0')
int h = 10 * Ctod(utctime[0]) + Ctod(utctime[1]);
int m = 10 * Ctod(utctime[2]) + Ctod(utctime[3]);
int s = 10 * Ctod(utctime[4]) + Ctod(utctime[5]);
int us = 100 * Ctod(utctime[6]) + 10 * Ctod(utctime[7]) + Ctod(utctime[8]);
double t = (h * 60L + m) * 60 + s + us/1000.;
在任何一种情况下,一旦获得t
值,只需像往常一样减去并进行比较。
如果您不想使用浮点数,请将t
更改为long int
,根据需要更改比例因子,并将最终差异与400
进行比较,而不是{{1 }}
(但是所有这些都说过,我不会太担心效率。对于一个可怜的人来说,10赫兹可能听起来很快,但十分之一秒对于一台体面的计算机来说是一段很长的时间。)