我正在尝试将8位微控制器(PIC)上的C整数分解为ASCII等效字符。
例如: 将982转换为'9','8','2'
到目前为止我提出的所有内容似乎都非常强大。这是我现在基本上做的主要想法:
if( (10 <= n) && (n < 100) ) {
// isolate and update the first order of magnitude
digit_0 = (n % 10);
// isolate and update the second order of magnitude
switch( n - (n % 10) ) {
case 0:
digit_1 = 0;
break;
case 10:
digit_1 = 1;
break;
...
然后我有另一个函数只为我的每个数字添加0b00110000(48decimal)。
我一直无法找到任何C函数来为我做这件事或自己做得很好。
提前感谢您的帮助!
答案 0 :(得分:4)
如果sprintf
由于某种原因不合适,那么像这样的简单方法就可以了:
char digits[MAX_DIGITS];
int count = 0;
do {
digits[count++] = n % 10;
n /= 10;
} while (n > 0);
会有count
个数字,digits[0]
是最不重要的数字。
答案 1 :(得分:1)
要自己动手,您需要执行以下示例代码演示的操作:
#include <stdio.h>
int main (void)
{
unsigned int x = 512;
int base_val = 10, digit, i = 0, n = 0;
char x_str[32], t;
printf ("\nEnter an unsigned number: ");
scanf ("%u", &x);
printf ("\nEnter base: ");
scanf ("%d", &base_val);
/* Chop the digits in reverse order and store in `x_arr`
* the interpretation of the digits are made in base value
* denoted by `base_val`
*/
while (x)
{
digit = x % base_val;
x /= base_val;
if (digit < 10)
x_str[n++] = digit + '0';
else
x_str[n++] = digit + 'A' - 10; /* handle base > 9 */
}
/* Terminate string */
x_str[n] = '\0';
/* Reverse string */
for (i=0; i<n/2; i++)
{
t = x_str[i];
x_str[i] = x_str[n-i-1];
x_str[n-i-1] = t;
}
printf ("\n%s\n", x_str);
return 0;
}
while
循环将从给定基数中的整数中删除数字,并以数组的相反顺序输入数字。内部if - else
处理基数超过9,并在数字值大于10时放置大写字母。for
循环反转字符串并以正向顺序将字符串切换为字符串。
您需要根据最大功能调整x_str
数组的大小。为它定义一个宏。请注意,上面的代码仅适用于无符号整数。对于有符号整数,您需要先检查它是否低于0,然后在x_str
中添加一个“ - ”符号,然后打印幅度即。将上述代码应用于-x
。这也可以通过屏蔽检查符号位来完成,但是会使进程依赖于整数的存储。
base_val
是您想要解释数字的基础。
答案 2 :(得分:1)
如果您与PIC16 RISC汇编器兼容,那么这非常简单,快速,简短且有效。在这里你有16位无符号16位除以10 rutine来看看如何做到这一点。
要获得WREG中数字的第一个最小字符,请将16位无符号数字添加到Reg1和Reg2并调用rutine。为了得到下一个字符再次调用rutine,依此类推,直到Reg1和Reg2为0。
RegAE res 1
RegA0 res 1
RegA1 res 1
RegA2 res 1
divR16by_c10
;{
;//Input: 16 bit unsigned number as RegA1,2 (RegA2 low byte, RegA1 High byte)
;//Division result: Reg1 and Reg2 and reminder as char in WREG
clrf RegA0
movlw 16 ;//init loop counter
movwf RegAE
lslf RegA2, f
divI16by_c10_
rlf RegA1, f
rlf RegA0, f
movlw 10
subwf RegA0, f
btfsc Carry
bra divI16by_c10_OK
addwfc RegA0, f
bcf Carry
divI16by_c10_OK
rlf RegA2, f
decfsz RegAE, f
bra divI16by_c10_
;//result= W from 0..9
addlw 0x30 ;//convert to char
return
;}
编辑:
如果要转换已签名 16位值,请先检查第15位,以确定符号编号。如果为负而不是写 - 符号并否定RegA1,2中的数字。之后是程序相同的正数。 要否定数字,您可以使用以下asm rutine:
comf RegA2, f
comf RegA1, f
movlw 0
bsf STATUS, 0 ;//set carry flag
addwfc RegA2, f
addwfc RegA1, f
答案 3 :(得分:1)
很久以前我回答了这样的问题。
我希望这会有所帮助。这适用于整数和浮点数。这个概念很简单。
由于算法每次迭代都会处理一个数字,因此它的O(logn)时间非常合理。