• 締切済み

2進数から10進数へ変換プログラム

皆さんこんにちは (・。・) 2進数から10進数へ変換プログラムを作りたいのですが、分かりません 自分の電卓機で計算すると  1011=11 1010=10 101010=42 現在 O'rielly の本をよんでいますが、書いたこともちょっと分かりづらいので、お願いします。 有難うございます

みんなの回答

noname#226737
noname#226737
回答No.5

まず2進数が10進数・16進数では4bitで処理する為4で割り切れる前処理が必要です。 長さが4で割り切れない時は0で補完します。 11→0011 の様な形です。 これを一致させて0~Fに分岐一致させます。 スイッチ文またはif文にて、 サブルーチン if(motome eq "0000"){kotae = "0";return(kotae)} else if(motome eq "0001"){kotae = "1";return(kotae)} .... else if(motome eq "1111"){kotae = "F";return(kotae)} else{err("エラー間違いです0")} return; これをやると16進文字が出来上がります。 説明が長くなるの殆んど省きましたがサーバーで動かすPerl/CGIでしたらホームページ 「たっちゃんのHP」の大きな数値の計算機に入っています。 書式が違うので分かりにくいかもしれませんが、zipで見てください。

参考URL:
http://www2s.biglobe.ne.jp/~tatsuji/
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★このカテゴリで『2進数』キーワードで検索するとたくさん出てきますよ。 ・最初に『2進数』とは? ・たとえば、2 進数の『1011』はなぜ 10 進数にすると『11』になるのかを考えます。  すると『1011』が次のように  =『1×(2^3)』+『0×(2^2)』+『1×(2^1)』+『1×(2^0)』  =『1×8』+『0×4』+『1×2』+『1×1』  =『8』+『0』+『2』+『1』  =『11』←10進数です。  となっているからです。分かりますか? ・もうちょっと分かりやすく書き換えると  『1×(2^3)』+  『0×(2^2)』+  『1×(2^1)』+  『1×(2^0)』=『1011』となります。  つまり、下位ビットから順に 2 の 0乗、1乗、2乗、3乗…となります。  これをプログラムに変換するには下位ビットから順に 2 の n乗をビット単位で掛けていきます。  そして、そのかけた数をどんどん加算していきます。すると 10 進数の値が得られます。 ・今回は 2 進文字列を 10 進整数に変換する方法と思いますので、左から文字列を解読して  1ビット左シフトします。その後に、0 か 1 をビット OR していけば良いでしょう。  下にそのサンプルを載せます。 サンプル: char *string = "1011"; ←これが2進文字列 char *p; ←文字列のポインタ int ans; ←10進整数の変数 ans = 0; ←初期化(for文の式1に記述しても良い) for ( p = string ; *p != '\0' ; p++ ){  if ( *p == '0' ){   ans <<= 1; ←2進数なので1ビットシフト(8進数ならば3ビットシフト)   ans |= 0; ←*p が'0'だから0(特に必要ありませんが対応を取るために記述)  }  else if ( *p == '1' ){   ans <<= 1;   ans |= 1; ←*p が'1'だから1  }  else break; ←0 or 1 以外の文字(変換終了) } printf( "ans = %d\n", ans ); ←変換結果を表示 最後に: ・上記のサンプルは 2 進文字列を 10 進整数に変換しますが、4進、8進文字列の場合は、  シフトするビット数を 2、3ビットにします。あと 4進は'0'~'3'まで、8進では'0'~'7'の  文字の部分を増やします。 ・上記は『ans <<= 1;』と『ans |= 1;』の2行に分け if-else を使っていますが、  for 文中を『ans = ((ans << 1) | (*p - '0'));』という1行でも記述できます。 ・以上。おわり。→下の『参考URL』もどうぞ。

参考URL:
http://oshiete.goo.ne.jp/search/search.php?status=select&MT=2%BF%CA%BF%F4&ct_select=1&ct0=205&ct1=221&ct2=250
回答No.3

  #include <stdio.h> int main(void) { int num, ch; for(num = 0; (ch = getchar()) != '\n'; ) num = num * 2 + (ch == '1'); printf("%d", num); return 0; }  

  • yaa6
  • ベストアンサー率22% (2/9)
回答No.2

2進数をあらわす文字列(0,1の列)をStrBとします。 答えとなる10進数をintDとし、0で初期化します。 StrBの長さを測り、lbとします。 文字列を左から(たいていのプログラミング言語は処理が右からなので)一文字ずつ調べ、n番目(n = 1,2,3…)の文字のとき その文字が1なら intD = intD + 2の(lb - n)乗 (何乗という計算のない言語ならループを回して2を(lb - n)回掛けます) その文字が0なら、何もしない すべての文字について処理をした後のintDが答えの10進数です。

  • debukuro
  • ベストアンサー率19% (3634/18947)
回答No.1

右端を第0ビットとし左に向かってビット番号をつけます ビット番号をnとし、ビットが立っているときそのビットの十進数は 2のn乗となります たとえば 第一ビットと第三ビットが立っていれば 第一ビットは2の1乗=2 第三ビットは2の三乗=8 したがって 1010=2+8=10 となります 第0ビットが立っていれば 2の0乗=1 です

関連するQ&A