10進数を2進数に変換するプログラムを組もうとしてるけど…

kerotan0820
記事: 91
登録日時: 14年前

10進数を2進数に変換するプログラムを組もうとしてるけど…

投稿記事 by kerotan0820 » 13年前

題名の通りのプログラムを組んで関数化したら、課題研究で組んでるプログラムのデバッグがしやすいな~と思い組んでたけど、プログラムが荒れに荒れています。

CODE:


/*
---------------------------------
割   2   割     あ
る   で   っ     ま
数   割   た     り
        数
a               b           c
7 ÷ 2 = 3 あまり 1
3 ÷ 2 = 1 あまり 1
----------------------------------
*/
#include

int main(void)
{
	char buff[17]={' '};
	int a=0,i=0,wa=0;

	printf("10進(65535以下):");   scanf("%d",&a);
	while(1)
	{
		wa = a;				//入力した値を2で割った余りを計算するためコピーをとる
		a = a / 2;			//入力した値を2で割って代入(1かその他)
		wa = wa % 2;			//入力した値の2で割った余り(0か1)

		if(a==0)
		{
			buff[i] = '0';
			break;
		}

		if(wa==0)	buff[i] = '0';
		else	    buff[i] = '1';
		
		if(a==1)				//割った値が1ならば1を最上位ビットに。
		{
			if(buff[0]!=(0||1)) i+=1;

			buff[i] = '1';	//1を最上位ビットに代入
			break;			//割った値が1→もう2で割れないから終了
		}

		i+=1;				//iに1を加算
	}
	printf("%016s\n",buff);

	return 0;
}
うぇうぇ…(´;ω;`)
単純に2でわってその余りの数を記録して2進数に変換しようと思ったのですが、実際組んでみると、最初に1や0が入力されたらどう処理すれば良いのかといった処理に頭がこんがらがる…。

2進数で出力する関数が標準関数として無いだけで、処理自体はビット演算を用いることが出来るのだから、シフトして、0000 とかを&すれば、各ビットの値は取り出せるんじゃないのとか今更ながら思い始めた(マスキングというのでしたっけ...)

バイトから帰宅したらやってみようと思う!

また、皆様の意見などが聞けたら幸いに思います。
では、働いてきます。


追記:
このプログラムは、もし 3 が入力されたら、というのを仮定して組んでいました。
3の場合問題なく出力されますがそれ以外は正しく動作しません。
最後に編集したユーザー kerotan0820 on 2012年8月20日(月) 12:33 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前

Re: 10進数を2進数に変換するプログラムを組もうとしてるけど…

投稿記事 by softya(ソフト屋) » 13年前

答えを書くと簡単なんだけどprintfするだけならbufも不要で4行ぐらいで書けそうです。
予想されている通り&とシフトを使います。

nil
記事: 428
登録日時: 13年前

Re: 10進数を2進数に変換するプログラムを組もうとしてるけど…

投稿記事 by nil » 13年前

► スポイラーを表示
面白そうなのでやってみました。
[追記]色々修正
符号なし整数で32bit分表示できる……はずです。
最後に編集したユーザー nil on 2012年8月20日(月) 13:13 [ 編集 6 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: 10進数を2進数に変換するプログラムを組もうとしてるけど…

投稿記事 by みけCAT » 13年前

CODE:

if(buff[0]!=(0||1)) i+=1;
これは

CODE:

if(buff[0]!=1) i+=1;
と同じ意味ですね。
わかりにくいので、真面目に書くならやめたほうがいいと思います。

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: 10進数を2進数に変換するプログラムを組もうとしてるけど…

投稿記事 by みけCAT » 13年前

私も書いてみました。
► スポイラーを表示
オフトピック
spoilの中のcodeの中で'を使うと変な記号になるバグ、早く直して欲しいです。
最後に編集したユーザー みけCAT on 2012年8月21日(火) 08:54 [ 編集 3 回目 ]
理由: バグ修正

kerotan0820
記事: 91
登録日時: 14年前

RE: 10進数を2進数に変換するプログラムを組もうとしてるけど…

投稿記事 by kerotan0820 » 13年前

[softya(ソフト屋)様]
4行…というわけには行きませんでしたが、&とシフトで完成しました。
後ほど記事に投稿したいと思います。



[涼雅様]
こっこれはスマートですね。
涼雅様のプログラムを見てしまったら影響されてパクリになりそうなので見ずに私は組み直したのですが、とても似たものでした!
そっくりです。
渡しの場合は行数がぐんと増えましたが、ビット数を始めに求めた後for文で表示するので、32ビット以上も対応出来るようにしてみました。
ありがとうございました!^^



[みけCAT様]
if(buff[0]!=(0||1))
これでは、条件が一切機能していませんよね…。
if(buff[0] != 0 && buf[0] != 1)
このように記述すればよろしいのでしょうか?
あと、みけCAT様のプログラムも拝見させていただきました。
また後ほど解読してみたいと思います(~O~;)
最後に編集したユーザー kerotan0820 on 2012年8月21日(火) 21:26 [ 編集 1 回目 ]