gpt4 book ai didi

当没有数据类型可以容纳完整数字时,将十六进制转换为十进制

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

我正在使用 C 语言的 PIC 微处理器。它是 16F,所以它不能容纳大于 32 位的整数(unsigned int32 是可用的最大数据大小)

我从一位读者那里收到了一个 5 字节的 ID 代码。要传输它,我必须逐位编码为 BCD。我无法将它冲刺成一个字符串,因为它比数据大小大,而且无法处理它。我不能划分它,因为没有为它定义操作。

我想不出任何可能的解决方案,有没有人以前处理过这个问题?

编辑:

我收到一系列 5 个字节的数字:

FF-FF-FF-FF-FF

我需要将它转换成十进制

0123456789012

(13位,十进制长度为256^5)通过RS232发送。第二个函数(获取 ASCII,并发送它)我已经可以使用它了,但是在我可以用它做任何事情之前我需要完整数字的字符串表示。

最佳答案

假设您有 32 位算术:2**24 = 16777216,因此将 x 作为最重要的 2 个字节,将 y 作为最不重要的 3 个字节:

  (16777216 * x + y) / 1000 
= (16777000 * x + 216 * x + y) / 1000
= 16777 * x + (216 * x + y) / 1000

第一项可以 32 位计算而不会溢出(自 x < 2**16 起)。第二项也可以计算而不会溢出(因为 x < 2**16y < 2**24 )。

这基本上是基数 2**24 中的长除法一个 2 位数的值,但使用预先计算的项知道除数是 1000。选择一千是因为它是大于 2**8 的 10 的最小幂。 .

因此,首先计算最低的三位数字,使用 (2**32) % 1000 == 296 的事实.所以这次我们将x作为最高字节,y作为低4字节

((2**32) * x + y) % 1000 = ((2**32) * x) % 1000 + y % 1000 (modulo 1000)
= (296 * x) % 1000 + y % 1000 (modulo 1000)
((2**32) * x + y) % 1000 = ((296 * x) % 1000 + y % 1000) % 1000

然后使用上面的公式将原始数字除以 1000。然后您就安全地进入了 32 位领域,并且可以使用正常循环生成剩余的数字。

顺便说一句,如果我是你,我会检查结果:我没有测试过这个,可能我在某个地方犯了错误。与在 PC 上使用 64 位整数的常用方法完成的 bcd 转换结果进行比较应该很容易。

关于当没有数据类型可以容纳完整数字时,将十六进制转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1143302/

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