【C言語】10進数から2進数に変換するプログラム

文字サイズ 

はじめに

どうも! 高杉 皆為(@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になるので正解ですね。

今回はここまでです。ややこしい文法もありますが、慣れたら平気です。皆さん、お疲れ様でした。

以下、関連記事です。興味があればどうぞ。


 

みなためじゃんけん

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

みなためじゃんけん、じゃんけんぽん!

私が出したのは……





グーでした! パーの勝利です!



この記事をSNSでシェアする

プログラミングカテゴリーの最新記事(5件)

最新記事(10件)

管理人のTwitter

内部リンク集