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

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

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

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

Q&A

解決済

2回答

3772閲覧

C言語の進数変換(2進数↔10進数)

lay55

総合スコア4

C

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

0グッド

0クリップ

投稿2022/09/18 07:49

編集2022/09/18 10:55

C言語の進数変換について質問です。
10進数を2進数に変換し、再度10進数に戻すプログラムを作成しており、2進数変換は出来たのですが、元の10進数に戻りません、、。どこが間違っているのか教えていただきたいです。よろしくお願いします。

#include <stdio.h> #include<math.h> #define MAX_BIT 32 int main(void) { unsigned int n=5, a, n2[MAX_BIT]; int n10 = 0; double x; for (int i = 0; i < MAX_BIT; i++) { // 入力したnを2進数に変換 a = (unsigned int)1 << i; if ((a & n) == 0) { n2[i] = 0; } else { n2[i] = 1; } } for (int i = 0; i < MAX_BIT; i++) printf("%d", n2[i]); //2進数表示 for (int i = 0; i < MAX_BIT; i++) { // nを10進数に戻す x = pow(2, i); if (n2[i] == 1) { n10 += (int)x; } } printf("%d", n10); return 0; }

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

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

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

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

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

jimbe

2022/09/18 11:14 編集

外から見ると入力した値が表示されるだけで、内部で 2 進数の配列にしているのとか全く見えないので、変換の意味がありませんし、変換が出来ているのかも分かりません。(最悪、10→2、2→10のどちらも間違えていても結果がたまたまあっている場合もあるかもしれません。) 2 進数の配列に変換した際にその配列も表示したほうが良いと思います。
lay55

2022/09/18 10:59

ご指摘いただき、ありがとうございます。確かに、2進数に変換出来ているか確認できた方が良いですね。 2進数変換後の配列を表示するよう修正しました。(下の10進数に戻す箇所も修正してあります。)
guest

回答2

0

2進数への変換でシフト演算子 << を使っているのだから、
10進数への変換でもシフト演算子を使えばよいでしょう。

C

1 for (int i = 0; i < MAX_BIT; i++) // nを10進数に戻す 2 n10 += n2[i] << i;

2進数への変換でシフト演算子 >> を使えば、次のように書けます。

C

1 for (int i = 0; i < MAX_BIT; i++) // 入力したnを2進数に変換 2 n2[i] = n >> i & 1;

投稿2022/09/18 08:56

kazuma-s

総合スコア8222

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

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

lay55

2022/09/18 09:58

ご回答ありがとうございます。 とてもシンプルで感動したので、ぜひ使用させていただきたいと思い、色々動かしたり、調べたりしたのですが、仕組みが分かりません、、もしよろしければ教えていただきたいです。
lay55

2022/09/18 10:13

n2[i] = n >> i & 1; ←この意味が分からなかったのですが、なんとか理解出来ました!!ありがとうございました。
guest

0

ベストアンサー

C

1 for (int i = 0; i < MAX_BIT; i++) { // nを10進数に戻す 2 x = 0; 3 x= pow(2, i); 4 n10 += n2[i] + (int)x; 5 } 6 7

C

1 for (int i = 0; i < MAX_BIT; i++) { // nを10進数に戻す 2 x= pow(2, i); 3 if (n2[i]==1){ 4 n10 += (int)x; 5 } 6 } 7

にしてください。

投稿2022/09/18 08:04

tatsu99

総合スコア5540

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

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

lay55

2022/09/18 08:15

ようやく分かりました!!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問