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

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

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

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

Q&A

解決済

2回答

4906閲覧

C言語の二進数変換処理のやり方

n6n9Qsmt8gLjwKw

総合スコア29

C

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

0グッド

0クリップ

投稿2016/01/20 11:35

こんにちは
共用体のchar配列に入力したデータを2進数変換して表示したいのですがうまくいかず、困っています。
入力する値は整数305419896(16進数で0x12345678)とし、出力時bit[0]bit[31]に0か1が入るように表示させたいです。
また、私の環境ではリトルエンディアンで処理されます。
サイトを参考にしながら2進数変換処理を作成したのですがbit[0]
[3]はなにも表示されず、それ以降の要素の値も305419896の2進数の値ではありませんでした。
itoa関数という非標準関数を使用してもできるそうですが、できれば使わずに処理を作成したいと思っています。
下記コードの変換処理のどこがまずいのか、ご指摘いただきたいです。

C

1#define _CRT_SECURE_NO_WARNINGS 2#include <stdio.h> 3#include <string.h> 4 5#define WORD_SIZE 2 6#define BYTE_SIZE 4 7#define BIT_SIZE 32 8 9typedef union 10{ 11 int data; /* 4byte */ 12 short word[WORD_SIZE]; /* 2byte×2 */ 13 char byte[BYTE_SIZE]; /* 1byte×4 */ 14 unsigned char bit[BIT_SIZE]; /* 1byte×32 */ 15}DATA; 16 17//関数プロトタイプ宣言 18void output_data(DATA *); 19 20int main(int argv, char* arg[]) { 21 22 DATA init_data; 23 DATA *union_data; 24 25 union_data = &init_data; 26 union_data->data = 305419896; 27 printf("入力データ:"); 28 printf("%d\n", union_data->data); 29 printf("=======================================\n"); 30 31 output_data(union_data); 32 33 int debag; 34 scanf("%d", &debag); 35 36 return 0; 37} 38 39void output_data(DATA *data) { 40 41 printf("DATA : 0x%08X\n", data->data); 42 printf("=======================================\n"); 43 printf("WORD(Hi) : 0x%04X\n", data->word[0]); 44 printf("WORD(Lo) : 0x%04X\n", data->word[1]); 45 printf("=======================================\n"); 46 int i; 47 for (i = 0; i < BYTE_SIZE; i++) { 48 49 printf("BYTE(%d) : 0x%02X\n", i, data->byte[i]); 50 51 } 52 printf("=======================================\n"); 53 54 for (i = 0; i<BIT_SIZE; i++) { 55 data->bit[i] = (data->data % 2) + '0'; 56 data->data /= 2; 57 printf("BITS(%d) : %c\n", i, data->bit[i]); 58 } 59 60}

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

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

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

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

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

guest

回答2

0

最後の for のところ、
data->data /= 2;
で data が書き換わっていますが、これによって共用体の同じデータである
bit[i] の方も変わってしまいませんか?
data->bit[i] = (data->data % 2) + '0';
で代入した結果が壊されてしまいます。

投稿2016/01/20 12:06

yoshi777

総合スコア674

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

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

n6n9Qsmt8gLjwKw

2016/01/21 10:24

yoshi777さん回答ありがとうございます。 共用体の場合、同じデータも書き換わることを失念しておりました。 ご指摘ありがとうございます。
guest

0

ベストアンサー

unsigned char bit[BIT_SIZE];

bitという変数名を付けても、bit配列になるわけではありません。unsigned charなので要素が1バイトの配列になります。

自分でビット変換するなら、
上位ビットから出力する場合は、0x80000000 とANDを取りながら左シフト、
下位ビットから出力する場合は、1とANDを取りながら右シフトするのでしょうか。

投稿2016/01/20 11:59

otn

総合スコア84499

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

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

n6n9Qsmt8gLjwKw

2016/01/21 10:22

otn算の解答を参考に下記コードに書き換えたところ解決できました。 ありがとうございます。 for (bit_cnt = 0; bit_cnt<BIT_SIZE; bit_cnt++) { /* ビットの表示 */ printf("BITS(%d) : %u\n", bit_cnt, (data->data>> bit_cnt) & 1); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問