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

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


実行例:
 (以下、UNIXのgccでコンパイル。実行。たとえば、こんな出力。重みを計算しています)

[tsuchiya@www1 arc]$ gcc 0401.c
[tsuchiya@www1 arc]$ ./a.out
8ビット = 11001011    ← ここが、入力 
2の0乗 1 * 1 = 1 : 1
2の1乗 2 * 1 = 2 : 3
2の2乗 4 * 0 = 0 : 3
2の3乗 8 * 1 = 8 : 11
2の4乗 16 * 0 = 0 : 11
2の5乗 32 * 0 = 0 : 11
2の6乗 64 * 1 = 64 : 75
2の7乗 128 * 1 = 128 : 203

[tsuchiya@www1 arc]$ ./a.out
8ビット = 00011100
2の0乗 1 * 0 = 0 : 0
2の1乗 2 * 0 = 0 : 0
2の2乗 4 * 1 = 4 : 4
2の3乗 8 * 1 = 8 : 12
2の4乗 16 * 1 = 16 : 28
2の5乗 32 * 0 = 0 : 28
2の6乗 64 * 0 = 0 : 28
2の7乗 128 * 0 = 0 : 28  ←

コメント



解答例

#include <stdio.h>
#include <string.h>

#define N 8

int main() {
   char binary[N+1];    /* 2進数 N bitを文字列で格納 NULL文字まででN+1 */
   int num;             /* 10進数 */

   int w;               /* 2進数の重み */
   int i;               /* 文字配列のi番目 N-1番目が最後尾 指数 0 */
   int val;             /* 2進数では0か1 */

   int ind;

   printf("%dビット = ", N);
   fgets(binary, N+1, stdin);

   num = 0;  /* 10進数の最初は 0 */
   ind = 0;  /* 指数の初期値 0 */
   w = 1;    /* 重みの初期値 1 */

   for (i = N - 1; i >= 0; i--) {
      val = binary[i] - '0';  /* アスキーコードの引き算で0か1の判定 */
      num += val*w;           /* 重みの足し算 */
      printf("2の%d乗 %3d * %d = %3d : %3d\n", ind, w, val, val*w, num);
      w *= 2;
      ind++;
   }

   return 0;
}