私は、 Cを使用して(%xを使用せずに、カスタム関数を使用して)整数を16進数として表示することについてのSOの質問を読んでいました。最初の回答は、目標を達成するためにビット演算子を使用することについて言及しています。
しかし、私はそれを自分で理解することはできません。誰かがこれがどのように行われるか教えてもらえますか?
私は、 Cを使用して(%xを使用せずに、カスタム関数を使用して)整数を16進数として表示することについてのSOの質問を読んでいました。最初の回答は、目標を達成するためにビット演算子を使用することについて言及しています。
しかし、私はそれを自分で理解することはできません。誰かがこれがどのように行われるか教えてもらえますか?
これがあなたに少し明確になることを願っています。
char *intToHex(unsigned input)
{
char *output = malloc(sizeof(unsigned) * 2 + 3);
strcpy(output, "0x00000000");
static char HEX_ARRAY[] = "0123456789ABCDEF";
//Initialization of 'converted' object
// represents the end of the string.
int index = 9;
while (input > 0 )
{
output[index--] = HEX_ARRAY[(input & 0xF)];
//Prepend (HEX_ARRAY[n & 0xF]) char to converted;
input >>= 4;
}
return output;
}
これは「最適なソリューション」ではありません。同じスレッドの他のポスターは、テーブルルックアップを提案しました。これははるかに優れています。
しかし、あなたの質問に答えるために、これは彼が提案していたこととほぼ同じです。
整数の各4ビットは正確に1つの16進数にマップされ、それらの4ビットの値が10未満の場合、そのASCII表現は「0」+値、それ以外の場合は「A」+値-10です。
シフトとマスキングにより、4桁の各グループを抽出できます。マスク値は0x0fであり、32ビット整数を想定すると、右シフトは24ビットで始まり、連続する桁ごとに4ずつ減少します。
#include <stdio.h>
unsigned int
hex_digit (int ival, int ishift)
{
ival = (ival >> ishift) & 0xf;
if (ival < 10)
ival += '0';
else
ival += ('a' + ival - 10);
return ival;
}
int
main()
{
int i = 100;
char s[9];
s[0] = hex_digit (i, 28);
s[1] = hex_digit (i, 24);
s[2] = hex_digit (i, 20);
s[3] = hex_digit (i, 16);
s[4] = hex_digit (i, 12);
s[5] = hex_digit (i, 8);
s[6] = hex_digit (i, 4);
s[7] = hex_digit (i, 0);
s[8] = '\0';
printf ("hex(%d)=%s\n", i, s);
return 0;
}
サンプル出力:
gcc -o tmp -g -Wall -pedantic tmp.c
./tmp
hex(100)=00000064