让我们说我有一个代表小数位的ASCII字符:
char digit; // between 0x30 ('0') and 0x39 ('9') inclusive
我想获取它表示的数值(在0
和9
之间)。
我知道两种可能的方法:
uint8_t value = digit - '0';
uint8_t value = digit & 0x0f;
就编译代码大小而言,哪一个是最有效的? 执行时间处理时间?能源消耗?答案可能是 特定于平台,我对架构类型最感兴趣 在运行低功耗应用的微控制器中可能会发现: Cortex-M,PIC,AVR,8051等。我自己的test on an Arduino Uno 似乎表明在AVR上并没有太大的区别,但是 我仍然想听听其他架构。
奖金问题:这两种方法都可以称为“行业标准”吗?是 在某些情况下,选择正确的选件至关重要?
免责声明:这是对a discussion arduino; stackexchange.com的答案。
答案 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