【发布时间】:2023-03-05 16:35:01
【问题描述】:
假设我有一个代表十进制数字的 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 的回答。
【问题讨论】:
-
“哪个效率最高” - 两者都不是。一点都没有关系。在优化的构建中,您很可能会得到相同的程序集。即使您不这样做,像这样的微观优化也只会为您节省纳秒 - 不是您能注意到的任何事情,所以不要担心。
-
digit - '0'保证适用于所有平台。digit & 0x0F适用于我知道的所有平台,但 C 或 C++ 标准不保证数字字符以 BCD 兼容的格式表示所有字符集。 -
@Edgar 我对此表示怀疑。但是,如果您真的需要了解,请运行一些基准测试。
-
@Eljay 问题是关于 ASCII 的。所有其他审议都是题外话
-
Re “行业标准”:我是从另一个用户那里引用的。 @tim:你能详细说明你的意思吗?
标签: c++ c performance embedded energy