- ベストアンサー
10進数→2進数?
例えば10進で入力された数値を 16進や8進で表示するには%x(%X)、%oを使えばよいのですが、 10進→2進で表示するプログラムをつくるには どうすれば良いのでしょうか? 10進で入力された値をどう計算すればいいか分かりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
すでに的確な回答をいただいていますが、 16進・8進からなら単純な文字列の置換で2進表現ができますね。 # あえてヒントだけ。
その他の回答 (4)
- okaki0429
- ベストアンサー率16% (2/12)
#4です。 プログラムにミスがあったので報告しておきます。 >//sizeof(int)<<3 == sizeof(int)*8 == 4byte*8 == 32bit >for (i=sizeof(int)<<3; i >= 0; i--) { >//各ビットが1かどうかを判断 >if (dec&(1<<i)) { この部分ですが i=32のとき、(1<<i)のところで(i<<32)となり、オーバーフローしてしまい、おそらく奇数の値に対しては最上位ビットが常に1になってしまうと思います。 なので、for文の中身を for (i=(sizeof(int)<<3)-1; i >= 0; i--) { if (dec & (1<<i)) { としましょう。 こうすることで、1<<31が最大となり、正しい値が得られるはずです。
- okaki0429
- ベストアンサー率16% (2/12)
他の回答者があえてヒントだけというのにコードを書くのはどうかと思いますが・・・。(他の回答者様ごめんなさい) char* dec2bin(int dec, char *bin) { int index=0; //配列の添字用 int i; //sizeof(int)<<3 == sizeof(int)*8 == 4byte*8 == 32bit for (i=sizeof(int)<<3; i >= 0; i--) { //各ビットが1かどうかを判断 if (dec&(1<<i)) { bin[index++] = '1'; } //この条件判定(index!=0)をしなければ32ビット長で配列に入れることになる //条件判定をしたときの例 //1010 //条件判定をしないときの例 //00000000000000000000000000001010 else if (index) { bin[index++] = '0'; } } //最後にヌル文字を追加 bin[index] = '\0'; return bin; } この回答が適切かどうかといえばわかりませんが、これで動くはずです。 基本的にarain様の内容と同じなのですが、使うとしても必ず何をしているかを考え、理解した上で使ってください。 ただこれだけは言っておきます。 使う際、配列の大きさは33以上にしてください。 追申、2進数以外にはこの方法は適応できないので、4進数なども考えて見ましょう! その際はikazuchizoku様の回答が参考になります。
- arain
- ベストアンサー率27% (292/1049)
16進数であれ、10進数であれ、PC上では「0」と「1」の羅列でしかありません。 例えば、 10進数で「10」なら、二進数では「1010」になります。 10進数で「7」なら、二進数では「0111」になります。 C言語ですから「ビット」と「バイト」の概念は理解していると思います。 また、「&」や「|」、「>>」「<<」といったビット演算も勉強していると思います。 この「0」と「1」かをビット演算で判断し表示すればできます。 せっかくですので、 >例えば10進で入力された数値を >16進や8進で表示するには%x(%X)、%oを使えばよいのですが、 を「%X」「%o」を使用しないで表示する方法も考えてみてください。
ここのHPに書いてあります
補足
参考URLを見て、改めて2進→10進に変える方法を 考えたら、分かりました。 ありがとうございます。
お礼
ありがとうございます。 { int a,b,c,d,e,x ; printf("10進数の値:") scanf("%d",&a); b = a%2; c = a/2%2*10; d = a/2/2%2*100; e = a/2/2/2%2*1000; x = b+c+d+e; printf("%dは2進で%d",a,x); } と、こんな感じでいいでしょうか?