質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

1542閲覧

c言語を使った2進数への変換プログラムがうまくいかない

toufu44

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2018/12/21 00:14

編集2018/12/21 00:16

前提・実現したいこと

c言語を使って10進数を2進数に変換するプログラムを作成しています。
※10進数は0から255までの整数とし、2進数は必ず8桁表示にする。

発生している問題・エラーメッセージ

自身で作成したプログラムだと、望んでいる計算結果を得ることができません。

出力された結果
10進数:17
2進数:00000001

該当のソースコード

c言語

1 2#include <stdio.h> 3 4int main(void){ 5 int j = 17; 6 int j2 = j; 7 int s = 1; 8 int tmp = 0; 9 int ans = 0; 10 while(j2 > 2){ 11 tmp = j2 % 2; 12 tmp = tmp * s; 13 ans += tmp; 14 j2 = j2 / 2; 15 s = s * 10; 16 } 17 printf("10進数:%d\n",j); 18 printf("2進数:%08d",ans); 19}

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

再帰でかいてみました。
b2.c

c

1#include <stdio.h> 2 3int dec2bin(int dec) { 4 if (dec < 2 ) { 5 return dec & 1; 6 } 7 return dec2bin(dec >> 1) * 10 + dec2bin(dec & 1); 8} 9 10int main(void) { 11 for (int i = 0; i < 256; i++) { 12 printf("10進数:%3d, %08d\n", i, dec2bin(i)); 13 } 14 return 0; 15}

実行例
イメージ説明
途中省略
イメージ説明

投稿2018/12/22 11:08

編集2018/12/25 12:56
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

while(j2 > 2){

while(j2 > 0){

かな。

投稿2018/12/21 00:28

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toufu44

2018/12/21 06:13

回答いただきありがとうございました。 無事、正確な結果が得られました。
guest

0

すでに解決済みの問題ですが、なぜ最初に while(j2 > 0) とすべきところをwhile(j2 > 2)
としてしまったのか、きちんと振り返って置くことが勉強になりますよ。

投稿2018/12/25 09:53

tsuntsun

総合スコア199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

usr ~/test/tmp % ./a.out
s:10 ans: 1
s:100 ans: 1
s:1000 ans: 1
10進数:17
2進数:00000001
usr ~/test/tmp % cat t0.c

#include <stdio.h> // int main(void) { int j = 17; int j2 = j; int s = 1; int tmp = 0; int ans = 0; // while (j2 > 2) { tmp = j2 % 2; tmp = tmp * s; ans += tmp; j2 = j2 / 2; s = s * 10; printf("s:%d ans: %d\n", s, ans); } printf("10進数:%d\n", j); printf("2進数:%08d\n", ans); // return 0; }

問題は見つかりましたか?
・・・「追記」
最初に結果をクリア
ここからループ
結果を10倍する
ビット数が分かっているなら上位ビットから比較しましょう。
0だったら0を、1だったら1をセット・・・
ループ終端
結果を表示
・・こうなります
s:0
s:0
s:0
s:1
s:10
s:100
s:1000
s:10001
10進数:17
2進数:00010001
「ソース」・・・上記結果のソースです。参考までに・・・

#include <stdio.h> // int main(void) { int j = 17; int ans = 0; // for (int i = 7; i >= 0; --i) { ans = ans * 10; if (j & (1 << i)) { ans |= 1; } else { ans |= 0; } printf("ans:%d\n", ans); } // printf("10進数:%d\n", j); printf("2進数:%08d\n", ans); // return 0; }

投稿2018/12/21 01:50

編集2018/12/21 05:57
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2018/12/21 02:27 編集

意味がない(0×10は0?)と思われても10倍するのは最初です。でないと、思わぬ結果になります・・・何度間違ったか;;
toufu44

2018/12/21 06:15

勉強になります。 ありがとうございます。
cateye

2018/12/21 06:31

ビット判定のelse節は不要ですが説明のために付け加えてあります。
guest

0

これは別解なので、参考程度にどうぞ。

c

1#include <stdio.h> 2 3int main(void) { 4 int dec = 17, bin = 0; 5 6 for (int digit = 1, i = 0; i < sizeof(int)*8; i++, digit *= 10) { 7 if (dec & 1 << i) { bin += digit; } 8 } 9 10 printf("10進数: %d\n", dec); 11 printf(" 2進数: %08d\n", bin); 12 13 return 0; 14}

実行結果

text

110進数: 17 2 2進数: 00010001

投稿2018/12/21 05:19

編集2018/12/21 05:34
shozi3

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shozi3

2018/12/21 06:17

0~1023までは正常に出力しますけど、超えるとオーバーフローするので注意です。
guest

0

中身入れて追ってみました。

(17>2)
{
tmp= 17%2= 1;
tmp= 11 =1;
ans =0+1= 1;
j2= 17/2= 8;
s= 1
10= 10;
}
(8>2)
{
tmp= 8%2= 0;
tmp= 010= 0;
ans= 1+0= 1;
j2= 8/2= 4;
s= 10
10= 100;
}
(4>2)
{
tmp= 4%2= 0;
tmp= 0100= 0;
ans= 1+0= 1;
j2= 4/2= 2;
s= 100
10= 1000;
}
(2>2)
{
}

終了

投稿2018/12/21 00:18

編集2018/12/21 00:28
hillacken

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toufu44

2018/12/21 06:14

大変参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問