「基本情報技術者試験 令和元年度 春 午前 問1」の10進数を2進数変換のアルゴリズムをC言語で実装した。次の通りである。
10進数の99は2進数の1100011になる。
環境
windows10(64bit)
Borland C++ 5.5.1 for Win32
binary(名)2進数
次のコードをBinary.cとする。
#include <stdio.h>
void decimalToBinary(int j) {
int NISHIN[8]; //10進整数j(0<j<100)を格納する配列
int k;
// 10進数を2進数に変換
for (k = 0; k < 8; k++) {
printf("j = %d ", j);
NISHIN[k] = j % 2;
printf("NISHIN[%d] = %d\n", k, NISHIN[k]);
j = j / 2;
}
printf("2進数: ");
// 2進数を8桁目から順に出力する。
for (k = 7; k >= 0; k--) {
printf("%d", NISHIN[k]);
}
printf("\n");
}
int main() {
int decimal;
do {
printf("0より大きく100未満の10進数を入力してください: ");
scanf("%d", &decimal);
// 範囲外の場合は再入力を促す
if (decimal <= 0 || decimal >= 100) {
printf("入力が範囲外です。\n");
}
} while (decimal <= 0 || decimal >= 100);
printf("入力された数値: %d\n", decimal);
decimalToBinary(decimal);
return 0;
}
コンパイルして実行する。
c:\coco_c>Binary.exe
0より大きく100未満の10進数を入力してください: 200
入力が範囲外です。
0より大きく100未満の10進数を入力してください: 13
入力された数値: 13
j = 13 NISHIN[0] = 1
j = 6 NISHIN[1] = 0
j = 3 NISHIN[2] = 1
j = 1 NISHIN[3] = 1
j = 0 NISHIN[4] = 0
j = 0 NISHIN[5] = 0
j = 0 NISHIN[6] = 0
j = 0 NISHIN[7] = 0
2進数: 00001101
c:\coco_c>
10進数の13が2進数00001101となる。頭の0が不要だよな。この0を除去したい。
コードを改造する。
#include <stdio.h>
void decimalToBinary(int j) {
int NISHIN[8]; //10進整数j(0<j<100)を格納する配列
int i,k=0;
// 10進数を2進数に変換
while (j > 0) {
printf("j = %d ", j);
NISHIN[k] = j % 2;
printf("NISHIN[%d] = %d\n", k, NISHIN[k]);
j = j / 2;
k += 1;
}
printf("2進数: ");
// 2進数を8桁目から順に出力する。
for (i = k-1; i >= 0; i-=1) {
printf("%d", NISHIN[i]);
}
printf("\n");
}
int main() {
int decimal;
do {
printf("0より大きく100未満の10進数を入力してください: ");
scanf("%d", &decimal);
// 範囲外の場合は再入力を促す
if (decimal <= 0 || decimal >= 100) {
printf("入力が範囲外です。\n");
}
} while (decimal <= 0 || decimal >= 100);
printf("入力された数値: %d\n", decimal);
decimalToBinary(decimal);
return 0;
}
コンパイルして実行する。
c:\coco_c>bcc32 Binary.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Binary.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
c:\coco_c>Binary.exe
0より大きく100未満の10進数を入力してください: 200
入力が範囲外です。
0より大きく100未満の10進数を入力してください: 13
入力された数値: 13
j = 13 NISHIN[0] = 1
j = 6 NISHIN[1] = 0
j = 3 NISHIN[2] = 1
j = 1 NISHIN[3] = 1
2進数: 1101
c:\coco_c>
int型で入力可能な数字の最大値は2147483647である。
2147483647が入力できるようにコードを改造する。
#include <stdio.h>
void decimalToBinary(int j) {
int NISHIN[31]; //10進整数j(0<j<100)を格納する配列
int i,k=0;
// 10進数を2進数に変換
while (j > 0) {
printf("j = %d ", j);
NISHIN[k] = j % 2;
printf("NISHIN[%d] = %d\n", k, NISHIN[k]);
j = j / 2;
k += 1;
}
printf("2進数: ");
// 2進数を8桁目から順に出力する。
for (i = k-1; i >= 0; i-=1) {
printf("%d", NISHIN[i]);
}
printf("\n");
}
int main() {
int decimal;
//printf("0より大きく4294967297以下の10進数を入力してください: ");
//scanf("%d", &decimal);
do {
printf("0より大きく4294967297以下の10進数を入力してください: ");
scanf("%d", &decimal);
// 範囲外の場合は再入力を促す
if (decimal <= 0 || decimal > 2147483647) {
printf("入力が範囲外です。\n");
}
} while (decimal <= 0 || decimal > 2147483647);
printf("入力された数値: %d\n", decimal);
decimalToBinary(decimal);
return 0;
}
コンパイルして実行する。
コンパイルすると警告が出るのがよく分からない。
推測だけど4294967297がint型の上限値だからなのか?
うーん。この警告を出すのがダメとか言う人いるよな。
10進数の4294967297を2進数にすると1111111111111111111111111111111になる。
1111111111111111111111111111111は31桁ある。
c:\coco_c>bcc32 Binary.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Binary.c:
警告 W8008 Binary.c 51: 条件が常に真(関数 main )
警告 W8008 Binary.c 54: 条件が常に真(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
c:\coco_c>Binary.exe
0より大きく4294967297以下の10進数を入力してください: 2147483647
入力された数値: 2147483647
j = 2147483647 NISHIN[0] = 1
j = 1073741823 NISHIN[1] = 1
j = 536870911 NISHIN[2] = 1
j = 268435455 NISHIN[3] = 1
j = 134217727 NISHIN[4] = 1
j = 67108863 NISHIN[5] = 1
j = 33554431 NISHIN[6] = 1
j = 16777215 NISHIN[7] = 1
j = 8388607 NISHIN[8] = 1
j = 4194303 NISHIN[9] = 1
j = 2097151 NISHIN[10] = 1
j = 1048575 NISHIN[11] = 1
j = 524287 NISHIN[12] = 1
j = 262143 NISHIN[13] = 1
j = 131071 NISHIN[14] = 1
j = 65535 NISHIN[15] = 1
j = 32767 NISHIN[16] = 1
j = 16383 NISHIN[17] = 1
j = 8191 NISHIN[18] = 1
j = 4095 NISHIN[19] = 1
j = 2047 NISHIN[20] = 1
j = 1023 NISHIN[21] = 1
j = 511 NISHIN[22] = 1
j = 255 NISHIN[23] = 1
j = 127 NISHIN[24] = 1
j = 63 NISHIN[25] = 1
j = 31 NISHIN[26] = 1
j = 15 NISHIN[27] = 1
j = 7 NISHIN[28] = 1
j = 3 NISHIN[29] = 1
j = 1 NISHIN[30] = 1
2進数: 1111111111111111111111111111111
c:\coco_c>
2147483647は実は素数
2^31-1 = 2147483647