c - 如何获取小数点后的数字
问题描述
我正在为微控制器编写 C 代码,以将 GPS 数据格式化为一个 8 字节的消息。
我需要对其进行编码并快速解码。我想这样做:Int32 是 -2147483648 到 2147483647。
我们可以编码纬度:-89599999 到 -89599999 什么是位置 89° 59.9999' S 到 90° 59.9999' N
对于经度:-179599999 到 179599999 什么是位置 179° 59.9999' W 到 179° 59.9999' E
纬度 4 个字节,经度 4 个字节。总共 8 个字节的 CAN 消息。
没有乘除法怎么办?有没有办法在想要的小数位移动或获取数字。
我想以这种方式编码:
unsigned int32 charToInt32(char val)
{
unsigned int32 valOut;
valOut = val - '0';
return valOut;
}
int32 GPS_codeLongitude(char *tab, char dir)
{
int32 deg = 0;
deg = charToInt32(tab[0]) * 1000000000;
deg += charToInt32(tab[1]) * 100000000;
deg += charToInt32(tab[2]) * 10000000;
deg += charToInt32(tab[3]) * 1000000;
deg += charToInt32(tab[4]) * 100000;
deg += charToInt32(tab[6]) * 10000;
deg += charToInt32(tab[7]) * 1000;
deg += charToInt32(tab[8]) * 100;
deg += charToInt32(tab[9]) * 10;
deg += charToInt32(tab[10]);
if(dir == 'S') deg = -deg;
return deg;
}
int32 GPS_codeLatitude(char *tab, char dir)
{
int32 deg = 0;
deg = charToInt32(tab[0]) * 100000000;
deg += charToInt32(tab[1]) * 10000000;
deg += charToInt32(tab[2]) * 1000000;
deg += charToInt32(tab[3]) * 100000;
deg += charToInt32(tab[5]) * 10000;
deg += charToInt32(tab[6]) * 1000;
deg += charToInt32(tab[7]) * 100;
deg += charToInt32(tab[8]) * 10;
deg += charToInt32(tab[9]) ;
if(dir == 'W') deg = -deg;
return deg;
}
解决方案
这是一种方法:
static void int2str(char *buf, unsigned int x)
{
const unsigned int divs[] = { 1000000000, 100000000, 10000000, 1000000,
100000, 10000, 1000, 100, 10 };
for (int i = 0; i < sizeof divs / sizeof *divs; ++i)
{
unsigned char digit = '0';
while (x >= divs[i])
{
++digit;
x -= divs[i];
}
*buf++ = digit;
}
*buf++ = '0' + x;
*buf = '\0';
}
这将向左填充零,但这对于计算机对计算机的对话通常是可以的。此外,它不使用任何乘法或除法,但它非常迭代,所以不是很快......
推荐阅读
- spring-data - 根据文档,Spring Data Rest 不支持发布项目资源,但它支持吗?
- protractor - 量角器元素定位器是否需要 getter 函数
- parallel-processing - Fortran MPI_Isend 和 MPI_Irecv
- c++ - 在 C++ OOP 中,谁负责删除传递给构造函数的对象
- asp.net - ASP .NET Core cookie 身份验证
- spring-boot - Nginx 重复发布请求
- python - 如何通过两个不同大小的熊猫数据框的循环应用haversine函数?
- c++ - 运行 MFC 应用程序时,有没有办法输出到“控制台”?
- vba - BeforeUpdate 带有“新记录”按钮
- android - Android 模拟器 PlatformException(load_failed_ad, 无法重新加载失败的广告, id=571273309, null)