【问题标题】:Fastest convesion from uint8 to hex char从 uint8 到 hex char 的最快转换
【发布时间】:2020-07-16 10:32:34
【问题描述】:

假设我有一个 1 字节宽的整数(实际上只有低 4 位有效),我想将其转换为 char 形式的十六进制值。

uint8_t original_int = 0xF; // will always be 0x0 to 0xF
char converted_int = // something that doesnt require a string to use the std library
                     // yet is still portable. i'd just like to use 1 char

【问题讨论】:

  • @user2864740 我找不到这个问题的一个副本
  • @i486 不幸的是没有。我的颜色系统实际上需要这个

标签: c++


【解决方案1】:
char converted_int = 
    original_int < 0xA ? 
    ('0' + original_int) : 
    ('A' + original_int - 0xA);

这个是内存效率的。使用流水线执行,我认为它已经足够快了。

【讨论】:

  • 太棒了。它依赖于 ascii 表的设置方式,但希望它仍然足够便携
  • @nowi 我认为"0123456789ABCDEF" 数组的其他解决方案更快
  • @i486 0123456789ABCDEF 数组需要内存访问,而我的回答完全可以通过寄存器来完成。寄存器比内存访问快得多:)
  • @youkaichao 我同意,但是对于多次转换,数组将被加载到 CPU 缓存中。并且没有比较和分支。
  • @i486 这是有争议的。 CPU 缓存仍然比寄存器慢。也许速度取决于机器,但绝对是这个更节省内存。
【解决方案2】:

这有什么问题吗?

uint8_t original_int = 0xF;
char converted_int = "0123456789ABCDEF"[original_int];

使用字符串文字作为查找表有点时髦。但无论如何,查找表是要走的路。

【讨论】:

  • 需要内存加载,而不是完全在寄存器中发生。负载有时可能会被优化掉,但一般情况下不会。
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 2014-04-30
  • 2019-12-28
  • 2011-07-03
  • 2016-03-12
  • 1970-01-01
  • 2016-08-12
  • 2023-03-20
相关资源
最近更新 更多