dポイントプレゼントキャンペーン実施中!

C言語で、2進数から10進数に変換するプログラムを作ろうと思っています。

手計算で行う場合は2進数の
下1桁目×1
下2桁目×2
下3桁目×4。。。と計算しています。

下○桁目を取り出す方法を考えているのですが、思いつきません。

3桁の2進数を変換するプログラム(とりあえず101を変換することを考えて・・・)を書いてみたのですが、101を考えすぎたためか上手くいきませんでした。

最終的には10進数でintの範囲内程度の2進数の変換ができるプログラムを書きたいと思っています。

アドバイスをお願いします。

ちなみに、考えてみたプログラムは以下の通りです。
101以外で上手く変換できませんね・・・ ここに貼り付けるのが恥ずかしいです。

#include <stdio.h>
main()
{

int x ,i ,z[3];

scanf("%d",&x);
z[0]=x/100*4;
z[1]=(x/10-10)*2;
z[2]=(x-110)*1;

printf("%d",z[0]+z[1]+z[2]);

return 0;
}

A 回答 (7件)

no3殿のご回答が、個人的には、シンプルで賛同します。


以下参考です。

strtolやatoi以外で実現するとして、3桁が固定であれば、

手順0, fgets()などで文字を1バイトずつ取得
手順1, 1回目の値は、0x30を引いて1であれば2の2乗を加算
手順2, 2回目の値は、0x30を引いて1であれば2の1乗を加算
手順3, 最後の値は、0x30を引いて1であれば2の0乗(1)を加算

備考:変数の確保やループ処理は適宜行って下さい。
   fgets()ですと1回ずつenterが必要です。ttyを設定すれば
   enterなしで、入力は可ですが話が発散するので割愛します。
    • good
    • 1

 こんにちは。



 入力されるのはあくまで数字の文字列と考えてはどうでしょうか?
シフトとか難しいものを使わない方法として以下のような方法があります。

 1.入力されるものを数字の文字列として取得する
 2.取得した数字文字列を2進の整数と考え、整数値を作成する
  (1文字は各桁で文字列数は桁数に相当する)
 3.作成した整数値を10進の文字列として出力する

 解っていると思いますが、ヒントとして
 ・2進数は1桁上がると×2する
 ・10進数は1桁上がると×10する

 正の整数に限定するとそれほど難しくは無いはずです。
負の値や実数も視野に入れるとかなり難しくなります。

 2.と3.の部分に汎用性を持たせると 2進→16進、10進→8進
のような変換もできます。

 ご参考までに。
    • good
    • 2

>手計算で行う場合は2進数の


>下1桁目×1
>下2桁目×2
>下3桁目×4。。。と計算しています。
この考え方は合ってます。

>z[0]=x/100*4;
>z[1]=(x/10-10)*2;
>z[2]=(x-110)*1;
取出し方が間違ってます。

1桁目 10で割った余り
 C/C++では余りを求めるのに % と言う便利な演算子があります。
2桁目以降は桁下げを行って1桁目と同じ方法で求めると簡単です。
((x/ 10) % 10) * 2
3桁目,4桁目も同じように
((x/100) % 10) * 4
((x/1000) % 10) * 8
で求める事が出来ます。
もっとスマートな方法もありますが、それはご自分で工夫してください。
    • good
    • 0

intの中身は2進数。


printfすると10進数。

コーディングして変換する意味は?
何かの課題ですか?
    • good
    • 1

2進数から10進数への変換であれば...



printf("%ld\n", strtol("101", NULL, 2));

でよいのでは?
    • good
    • 2

#include <stdio.h>


void main(void)
{
 int d,b,a;
 scanf("%d",&b);
 d=0;
 a=1;
 for(;b!=0;) {
  d += b % 10 == 0 ? 0 : a;
  a <<= 1;
  b /= 10;
 }
 printf("%d",d);
}
10ビットまでです。11桁入れると誤動作します。
(11桁だとscanfでbがオーバーフローする)
    • good
    • 0

for (ix=strlen(string)-1; 0 <= ix; ix--){


var += string[ix] * ???

というような感じで
    • good
    • 0

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