10進数を2進数に変換する (10進 ⇒ 2進 基数変換)

<問題> 正の10進数を入力、2進数へ基数変換せよ。

実行例:  重みを見つけていく方法 (割り算しない方法) 

[tsuchiya@www1 arc]$ ./a.out
10進数 : 123 ← ここは、入力
2の  6乗     64 ← 含まれている重みを表示
2の  5乗     32
2の  4乗     16
2の  3乗      8
2の  1乗      2
2の  0乗      1
 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0  ← 2の指数
  0  0  0  0  0  0  0  0  0  1  1  1  1  0  1  1  ←  ビット 0000 0000 0111 1011 です。

[tsuchiya@www1 arc]$ ./a.out
10進数 : 65535
2の 15乗  32768
2の 14乗  16384
2の 13乗   8192
2の 12乗   4096
2の 11乗   2048
2の 10乗   1024
2の  9乗    512
2の  8乗    256
2の  7乗    128
2の  6乗     64
2の  5乗     32
2の  4乗     16
2の  3乗      8
2の  2乗      4
2の  1乗      2
2の  0乗      1
 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1

コメント



解答例

#include <stdio.h>

#define N 16
int main() {
   int w[N];  /* 重みを格納 */
   int b[N];  /* 2進数の文字列 */
   int weight; /* 重み */
   int n; /* 入力 10進数 */

   int i; /* 配列の添え字 */
   i = 0; /* 初期値 */
   weight = 1; /* 初期値 2の0乗は1 */
   w[i] = weight;  /* w[0] のセット */
   b[i] = 0; /* b[0]のセット */

   /* 重み配列を計算、初期化。b配列を全て0に初期化 */
   for (i = 1; i < N; i++) {
      weight = weight*2;
      w[i] = weight;
      b[i] = 0;
   }

   /* 入力 */
   printf("10進数 : ");
   scanf("%d", &n);

   /* nが0になるまで、重みを大きい値から弾き続ける */
   i = N - 1;
   while (n) {
      if (n >= w[i]) {
            n = n - w[i];
            printf("2の%3d乗 %6d\n", i, w[i]); /* 引き算できたらprintf */
            b[i] = 1; /* その桁は、1 */
      }
      i--;
   }

   /* 大きい値から0へ */
   for (i = N - 1; i >= 0; i--) {
      printf("%3d",i);
   }
   printf("\n",i);

   /* 各桁が0 か 1か */
   for (i = N - 1; i >= 0; i--) {
      printf("%3d",b[i]);
   }
   printf("\n",i);

   return 0;
}