二進数への変換

 ビット演算をするにあたって、デバッグのために、N 進数(整数値)から二進数(文字列)へ変換する関数が必要になった。

 今更自作するのはどうも面倒で、Google 先生にお願いしよう、と Opera を立ち上げたところで思い出した。そういえばずいぶん昔に作ったような気がする。

 基本的に、一度作った関数は破棄しない主義であるから、関数置き場(a.k.a. ごみ置き場)を探してみることにした。果して ToBinary という関数が見つかったが、その内容に驚いた。


#include 
#define bitSize 16

int ToBinary(char bin[], int dig)
{
int i, mask;
char bit[16][5] = {
"0000", "0001", "0010", "0011", "0100",
"0101", "0110", "0111", "1000", "1001",
"1010", "1011", "1100", "1101", "1110",
"1111"
};

for (i = bitSize - 1; i >= 3; i -= 4) {
mask = dig & 0x0f;
bin[i] = bit[mask][3];
bin[i - 1] = bit[mask][2];
bin[i - 2] = bit[mask][1];
bin[i - 3] = bit[mask][0];
dig >>= 4;
}

bin[bitSize] = '\0';

return 0;
}


 見ての通り、非常に面倒な処理をしている。これを書いた当時の心境が思い出せないのだが、どうしてこんなプログラムを書いたのだろうか。ギャグ? 面白いといえば面白いのだが。

 今同じような処理を書くとしたら、mask, bit を取り除いて、for 文をこう置き換える。


  for (i = bitSize - 1; i >= 0; i--) {
bin[i] = dig % 2 + '0';
dig /= 2;
}


 こちらの方が素直で読みやすい。