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

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

実行例:  2で割り続ける、よく見る方法  143 = 2(71) + 1 = 2(2*35 + 1) + 1 という書き換えを繰り返す計算を行っている。

[tsuchiya@www1 arc]$ ./a.out
10進数 (65535以下の正の数) = 123 ← 入力
   123 ÷ 2 =     61 あまり   1
    61 ÷ 2 =     30 あまり   1
    30 ÷ 2 =     15 あまり   0
    15 ÷ 2 =      7 あまり   1
     7 ÷ 2 =      3 あまり   1
     3 ÷ 2 =      1 あまり   1
     1 ÷ 2 =      0 あまり   1
変換後の2進数 = 1111011
[tsuchiya@www1 arc]$ ./a.out
10進数 (65535以下の正の数) = 65535
 65535 ÷ 2 =  32767 あまり   1
 32767 ÷ 2 =  16383 あまり   1
 16383 ÷ 2 =   8191 あまり   1
  8191 ÷ 2 =   4095 あまり   1
  4095 ÷ 2 =   2047 あまり   1
  2047 ÷ 2 =   1023 あまり   1
  1023 ÷ 2 =    511 あまり   1
   511 ÷ 2 =    255 あまり   1
   255 ÷ 2 =    127 あまり   1
   127 ÷ 2 =     63 あまり   1
    63 ÷ 2 =     31 あまり   1
    31 ÷ 2 =     15 あまり   1
    15 ÷ 2 =      7 あまり   1
     7 ÷ 2 =      3 あまり   1
     3 ÷ 2 =      1 あまり   1
     1 ÷ 2 =      0 あまり   1
変換後の2進数 = 1111111111111111

コメント



解答例

#include <stdio.h>

#define N 16
int main() {
   int n;         /* 変換前の10進数 */
   int b[N];      /* 変換後の2進数 */
   int i;         /* b[]の格納位置 */

   /* キーボードから10進数を入力する */
   printf("10進数 (65535以下の正の数) = ");
   scanf("%d", &n);

   /* 10進数を2進数に変換する */
   i = 0;
   while (n) {
      printf("%6d ÷ 2 = %6d あまり %3d\n", n, n / 2, n % 2);
      b[i] = n % 2; /* 小さい桁の値が前に格納 */
      n /= 2;
      i++;
   }

   /* 変換後の2進数を表示 配列を逆に表示して、大きな桁を前に */
   printf("変換後の2進数 = ");
   i--;
   while (i >= 0) {
      printf("%d", b[i]);
      i--;
   }
   printf("\n");

   return 0;
}