假设我有一个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等。我自己在Arduino Uno上的测试似乎表明在AVR上没有太大区别,但是我仍然希望了解其他架构。
额外的问题:这两种方法都可以称为"行业标准"吗?是在某些情况下,选择正确的是至关重要的?
免责声明:这是对arduino的回答;stackexchange.com.
您应该自己编译它。
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