はじめに
どうも! みなため(@MinatameT)です。
この記事では、入力された10進数を2進数に変換するプログラムを紹介します。プログラミング言語はC言語です。
2進数は、0と1の数字だけを使って値を表現するものですね。
あまり難しいものではありませんし、1つずつ確実に理解していけばOKです。
それでは、プログラムをさっそく確認していきましょう。
10進数から2進数に変換するプログラムの例
ソースコード
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void)
{
int d; //入力値d
char b[3] = "01"; //2進数の配列
char b0[2] = {0}; //2進数の右から1ケタめ
char b1[2] = {0}; //2進数の右から2ケタめ
char b2[2] = {0}; //2進数の右から3ケタめ
char b3[2] = {0}; //2進数の右から4ケタめ
char b4[2] = {0}; //2進数の右から5ケタめ
char b5[2] = {0}; //2進数の右から6ケタめ
char b6[2] = {0}; //2進数の右から7ケタめ
char b7[2] = {0}; //2進数の右から8ケタめ
char b8[2] = {0}; //2進数の右から9ケタめ
char b9[2] = {0}; //2進数の右から10ケタめ
char b10[2] = {0}; //2進数の右から11ケタめ
char b11[2] = {0}; //2進数の右から12ケタめ
char b12[2] = {0}; //2進数の右から13ケタめ
char b13[2] = {0}; //2進数の右から14ケタめ
char b14[2] = {0}; //2進数の右から15ケタめ
char b15[2] = {0}; //2進数の右から16ケタめ
char bfin[20] = {0}; //2進数に変換した結果
int L; //ループ用変数L
int bv0,bv1,bv2,bv3,bv4,bv5,bv6,bv7,bv8,bv9,bv10,bv11,bv12,bv13,bv14,bv15; //2進数のそれぞれの桁の重み
printf("0から131071までの10進数の整数値を入力。>");
scanf("%d",&d); //dに10進数の整数値が入る。
/*2進数の計算*/
bv0 = (int)(d/(pow(2,0)))%2; //2^0の位
bv1 = (int)(d/(pow(2,1)))%2; //2^1の位
bv2 = (int)(d/(pow(2,2)))%2; //2^2の位
bv3 = (int)(d/(pow(2,3)))%2; //2^3の位
bv4 = (int)(d/(pow(2,4)))%2; //2^4の位
bv5 = (int)(d/(pow(2,5)))%2; //2^5の位
bv6 = (int)(d/(pow(2,6)))%2; //2^6の位
bv7 = (int)(d/(pow(2,7)))%2; //2^7の位
bv8 = (int)(d/(pow(2,8)))%2; //2^8の位
bv9 = (int)(d/(pow(2,9)))%2; //2^9の位
bv10 = (int)(d/(pow(2,10)))%2; //2^10の位
bv11 = (int)(d/(pow(2,11)))%2; //2^11の位
bv12 = (int)(d/(pow(2,12)))%2; //2^12の位
bv13 = (int)(d/(pow(2,13)))%2; //2^13の位
bv14 = (int)(d/(pow(2,14)))%2; //2^14の位
bv15 = (int)(d/(pow(2,15)))%2; //2^15の位
for(L=0; L<2; L=L+1)
{
if(bv0==L)
{
strncpy(b0,b+L,1); //b0に、配列bのL番めからの値を1つ分代入する。
}
if(bv1==L)
{
strncpy(b1,b+L,1); //b1に、配列bのL番めからの値を1つ分代入する。
}
if(bv2==L)
{
strncpy(b2,b+L,1); //b2に、配列bのL番めからの値を1つ分代入する。
}
if(bv3==L)
{
strncpy(b3,b+L,1); //b3に、配列bのL番めからの値を1つ分代入する。
}
if(bv4==L)
{
strncpy(b4,b+L,1); //b4に、配列bのL番めからの値を1つ分代入する。
}
if(bv5==L)
{
strncpy(b5,b+L,1); //b5に、配列bのL番めからの値を1つ分代入する。
}
if(bv6==L)
{
strncpy(b6,b+L,1); //b6に、配列bのL番めからの値を1つ分代入する。
}
if(bv7==L)
{
strncpy(b7,b+L,1); //b7に、配列bのL番めからの値を1つ分代入する。
}
if(bv8==L)
{
strncpy(b8,b+L,1); //b8に、配列bのL番めからの値を1つ分代入する。
}
if(bv9==L)
{
strncpy(b9,b+L,1); //b9に、配列bのL番めからの値を1つ分代入する。
}
if(bv10==L)
{
strncpy(b10,b+L,1); //b10に、配列bのL番めからの値を1つ分代入する。
}
if(bv11==L)
{
strncpy(b11,b+L,1); //b11に、配列bのL番めからの値を1つ分代入する。
}
if(bv12==L)
{
strncpy(b12,b+L,1); //b12に、配列bのL番めからの値を1つ分代入する。
}
if(bv13==L)
{
strncpy(b13,b+L,1); //b13に、配列bのL番めからの値を1つ分代入する。
}
if(bv14==L)
{
strncpy(b14,b+L,1); //b14に、配列bのL番めからの値を1つ分代入する。
}
if(bv15==L)
{
strncpy(b15,b+L,1); //b15に、配列bのL番めからの値を1つ分代入する。
}
}
snprintf(bfin,20,"%s%s%s%s %s%s%s%s %s%s%s%s %s%s%s%s",b15,b14,b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0); //bfinにb15~b0を連結させたものを代入する。
printf("%d(10進数) = %s(2進数)\n",d,bfin); //2進数に変換した結果を出力する。
return(0);
}
#include<math.h>は、pow関数を使うために必要です。pow関数については、以下の記事を参考にしてください。
#include<string.h>は、strncpy関数を使うために必要です。strncpy関数は、ある文字列を他の文字列に「上書き」するために利用されます。
strncpy関数の使い方については、以下の記事を参考にしてください。
snprintf関数についてですが、左から順番に見ていくと、bfinが代入先です。次に、「20」というのは代入する合計文字数 + 1の値です。半角スペースも文字数にカウントすることに注意してください。
次に、%sが16個ありますが、これは代入する変数の数だけ%sを書きます。最後に、代入する変数名を「,」で区切って順番に書きます。
snprintf関数の使い方については、以下の記事を参考にしてください。
char配列の宣言時に必要な文字数 + 1のサイズを確保しているのは、終端文字(NULL)が1つ入るためなのですが、ここでは詳しく説明しません。
また、char配列の宣言時に {0}; としているのは、配列の中を0で埋め尽くすため(ゼロクリアー)です。これをしないと、計算結果が間違う可能性があります。
それでは、実行結果を確認していきます。
実行結果の例
0から131071までの10進数の整数値を入力。>6
6(10進数) = 0000 0000 0000 0110(2進数)
これは、入力値の6(10進数)が110(2進数)に変換された様子ですね。
念のため、正解しているかどうか、検算してみましょうか。
一番左のケタの大きさが1 × 4 = 4です。その1つ右のケタの大きさが1 × 2 = 2です。
最後に、4 + 2 = 6になるので正解ですね。
0から131071までの10進数の整数値を入力。>28
28(10進数) = 0000 0000 0001 1100(2進数)
これは、入力値の28(10進数)が11100(2進数)に変換された様子ですね。
これも、念のために検算してみます。
一番左のケタの大きさが1 × 16 = 16です。その1つ右のケタの大きさが1 × 8 = 8です。さらに、その1つ右のケタの大きさが1 × 4 = 4です。
最後に、16 + 8 + 4 = 28になるので正解ですね。
今回はここまでです。ややこしい文法もありますが、慣れたら平気です。皆さん、お疲れ様でした。
以下、関連記事です。興味があればどうぞ。