主に、次のように単純に使用することをお勧めしますitoa()
。
static inline void hextoasacii(char *a_src, char *a_dest)
{
(void)itoa(*a_src, a_dest, 16);
}
しかし、これにはこれによって終了するという欠点がありa_dest
ますNULL
。つまり、3 (2 ではなく) バイトのスペースが必要なので、これは 100% 同等ではありません。
示されているインライン アセンブリ コードは、どのような場合でも、メモリ アクセスに関して特に最適というわけではありません。C/C++の raw フォーム (ただし、もちろん、255 エントリ サイズのhexlu[]
配列の正確な内容に依存します。char *hexlu[] = { "00", "01", "02", ... };
static inline void hextoascii(char *a_src, char *a_dest)
{
static const char hexdigits[16] = "0123456789abcdef";
int src = *a_src;
a_dest[0] = hexdigits[src >> 4];
a_dest[1] = hexdigits[src & 15];
// make this:
// *(unsigned short*)a_dest =
// ((unsigned short)hexdigits[src & 15]) << 8 |
// (unsigned short)hexdigits[src >> 4]
//
// if it absolutely _must_ be a single store
}
サイドノート:
2 進数/16 進数の変換を実際にアセンブリ方式で行いたい場合はpshufb
、16 文字のテーブル ルックアップに SSSE3 ( ) を使用して上記をコーディングする方法があります。これにより、実質的に単一の命令でと同等の処理をsprintf("%llx", tgt_string, val_uint64)
実行できます。 pshufb
これを行う方法の例とその仕組みの説明は次のとおりです。
XMM
SSSE3 ソリューションは、バイト単位で行うため、レジスタの 8 分の 1 しか使用されないため、一度に複数のバイトを変換するほど大きなスピードアップは提供しません。関数を (効率的に) 変換して、SSSE3 をそのまま使用することはできません。ただし、(メモリ領域の 16 進ダンプを出力するために) ループで呼び出している場合は、Wojciech のサンプル コードのような関数を使用すると、非常に大幅な速度向上が得られます。