- 締切済み
2進数から10進数へ変換プログラム
皆さんこんにちは (・。・) 2進数から10進数へ変換プログラムを作りたいのですが、分かりません 自分の電卓機で計算すると 1011=11 1010=10 101010=42 現在 O'rielly の本をよんでいますが、書いたこともちょっと分かりづらいので、お願いします。 有難うございます
- みんなの回答 (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で見てください。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★このカテゴリで『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』もどうぞ。
- yaemon_2006
- ベストアンサー率22% (50/220)
#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)
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)
右端を第0ビットとし左に向かってビット番号をつけます ビット番号をnとし、ビットが立っているときそのビットの十進数は 2のn乗となります たとえば 第一ビットと第三ビットが立っていれば 第一ビットは2の1乗=2 第三ビットは2の三乗=8 したがって 1010=2+8=10 となります 第0ビットが立っていれば 2の0乗=1 です