ソースコード
// filename: dtob.c
// convert decimal to binary
#include <stdio.h>
const int BitSize = sizeof(int) * 8; // 整数型のビットサイズを算出
void dtob(int x) {
  int bit = 1, i;
  char c[BitSize];
  for (i = 0; i < BitSize; i++) {
    if (x & bit)
      c[i] = '1';
    else
      c[i] = '0';
    bit <<= 1;
  }
  // 計算結果の表示
  printf("2進数: ");
  for ( i = BitSize - 1; i >= 0; i-- ) {
      putchar(c[i]);
  }
  printf("\n");
}
int main()
{
  int x = 0;
  do {
  printf("10進数を2進数に変換します(0で終了)\n");
  printf("xの値: ");
  scanf("%d", &x);
  dtob(x);
  } while (x != 0);
  return 0;
}
実行結果
$ gcc dtob.c $ ./a.out 10進数を2進数に変換します(0で終了) xの値: 5 2進数: 00000000000000000000000000000101 10進数を2進数に変換します(0で終了) xの値: 8 2進数: 00000000000000000000000000001000 10進数を2進数に変換します(0で終了) xの値: 100 2進数: 00000000000000000000000001100100 10進数を2進数に変換します(0で終了) xの値: 256 2進数: 00000000000000000000000100000000 10進数を2進数に変換します(0で終了) xの値: 1984949894 2進数: 01110110010011111110111010000110 10進数を2進数に変換します(0で終了) xの値: 0 2進数: 00000000000000000000000000000000 $
ビットが0か1の判断するループ順序を逆にして、配列末尾に’\0’を代入すれば、計算結果の表示は配列の文字列表示ですみます。そうすると「計算結果の表示」の際にforループを使う必要はないなぁ、と書き終わった今思いました(ぇー)。
作成の経緯
以前、拡張ハッシュ法の削除関数を実装している際に、キーをバケットに振り分ける際のアドレス算出の処理部分にデバッグプリントが欲しくて作ったものです。
コメント
[…] こちらのサイトを参考にしました(というかほぼ転載)。また、 ビット演算子が分からない方はこちらのサイトを参照してください。 […]