プロが教えるわが家の防犯対策術!

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

有難うございます

A 回答 (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/
    • good
    • 0

★このカテゴリで『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?statu …
    • good
    • 0

 


#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;
}
 
    • good
    • 0

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進数です。
    • good
    • 3

右端を第0ビットとし左に向かってビット番号をつけます


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

第0ビットが立っていれば
2の0乗=1
です
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!