将ASCII数字转换为其数值的最佳方法

时间:2020-09-12 15:48:50

标签: c++ c performance embedded energy

让我们说我有一个代表小数位的ASCII字符:

char digit;  // between 0x30 ('0') and 0x39 ('9') inclusive

我想获取它表示的数值(在09之间)。 我知道两种可能的方法:

  1. 减法:
    uint8_t value = digit - '0';
    
  2. 按位和:
    uint8_t value = digit & 0x0f;
    

就编译代码大小而言,哪一个是最有效的? 执行时间处理时间?能源消耗?答案可能是 特定于平台,我对架构类型最感兴趣 在运行低功耗应用的微控制器中可能会发现: Cortex-M,PIC,AVR,8051等。我自己的test on an Arduino Uno 似乎表明在AVR上并没有太大的区别,但是 我仍然想听听其他架构。

奖金问题:这两种方法都可以称为“行业标准”吗?是 在某些情况下,选择正确的选件至关重要?

免责声明:这是对a discussion arduino; stackexchange.com的答案。

1 个答案:

答案 0 :(得分:1)

您应该自己编译。

int foo(char x)
{
    return x - '0';
}

int foo1(char x)
{
    return x & 0x0f;
}

char foo2(char x)
{
    return x - '0';
}

char foo3(char x)
{
    return x & 0x0f;
}

和代码

__tmp_reg__ = 0
foo(char):
        mov __tmp_reg__,r24
        lsl r0
        sbc r25,r25
        sbiw r24,48
        ret
foo1(char):
        andi r24,lo8(15)
        ldi r25,0
        ret
foo2(char):
        subi r24,lo8(-(-48))
        ret
foo3(char):
        andi r24,lo8(15)
        ret
相关问题