共用体を用いてビット単位で操作できる1バイトの仮想レジスタを定義し、
「2進数8桁」で入力した数値データa,bの加算、減算、論理積、論理和、排他的論理和、a,bの否定、
それぞれの演算結果を2進数8桁で出力するプログラムを作成せよ。
という演習なのですが、行き詰ってしまいました。
コンパイルでエラーは出ないのですが、何故か入力が"文字列a:"のみ行われてしまいます。
どこが間違っているのかご指摘願います…。
#include<stdio.h>
typedef union{
char bn;
struct{
unsigned int b7:1;
unsigned int b6:1;
unsigned int b5:1;
unsigned int b4:1;
unsigned int b3:1;
unsigned int b2:1;
unsigned int b1:1;
unsigned int b0:1;
}bit;
}string;
//出力
void output(string t){
printf("%d",t.bit.b0);
printf("%d",t.bit.b1);
printf("%d",t.bit.b2);
printf("%d",t.bit.b3);
printf("%d",t.bit.b4);
printf("%d",t.bit.b5);
printf("%d",t.bit.b6);
printf("%d",t.bit.b7);
printf("\n");
}
int main(void){
char ax[9],bx[9];//一時的にa,bの値を受け取る変数
string a,b,sum,sub1,sub2,and,or,anot,bnot,xor;
printf("文字列a:"); fgets(ax,sizeof(ax),stdin);
printf("文字列b:"); fgets(bx,sizeof(bx),stdin);
//axをaの各ビットに格納
a.bit.b0=ax[0]; a.bit.b3=ax[4];
a.bit.b1=ax[1]; a.bit.b2=ax[5];
a.bit.b2=ax[2]; a.bit.b1=ax[6];
a.bit.b3=ax[3]; a.bit.b0=ax[7];
//bxをbの各ビットに格納
b.bit.b0=bx[0]; b.bit.b3=bx[4];
b.bit.b1=bx[1]; b.bit.b2=bx[5];
b.bit.b2=bx[2]; b.bit.b1=bx[6];
b.bit.b3=bx[3]; b.bit.b0=bx[7];
//演算
sum.bn = a.bn+b.bn; //和
sub1.bn = a.bn-b.bn; //差(a-b)
sub2.bn = b.bn-a.bn; //差(b-a)
and.bn = a.bn&b.bn; //論理積
or.bn = a.bn|b.bn; //論理和
anot.bn = ~a.bn; //aの否定
bnot.bn = ~b.bn; //bの否定
xor.bn = a.bn^b.bn; //排他的論理和
//出力
printf("和_"); output(sum);
printf("差(a-b)_"); output(sub1);
printf("差(b-a)_"); output(sub2);
printf("論理積_"); output(and);
printf("論理和_"); output(or);
printf("aの否定_"); output(anot);
printf("bの否定_"); output(bnot);
printf("排他的論理和_"); output(xor);
return 0;
}
共用体とビットフィールドを用いた演習
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 共用体とビットフィールドを用いた演習
もう一つの質問もですがフォーラムルールをお読みください。 http://dixq.net/board/board.html
codeタグを使わないコードは読み辛いのでお願いします。
codeタグを使わないコードは読み辛いのでお願いします。
#include<stdio.h>
typedef union{
char bn;
struct{
unsigned int b7:1;
unsigned int b6:1;
unsigned int b5:1;
unsigned int b4:1;
unsigned int b3:1;
unsigned int b2:1;
unsigned int b1:1;
unsigned int b0:1;
}bit;
}string;
//出力
void output(string t){
printf("%d",t.bit.b0);
printf("%d",t.bit.b1);
printf("%d",t.bit.b2);
printf("%d",t.bit.b3);
printf("%d",t.bit.b4);
printf("%d",t.bit.b5);
printf("%d",t.bit.b6);
printf("%d",t.bit.b7);
printf("\n");
}
int main(void){
char ax[9],bx[9];//一時的にa,bの値を受け取る変数
string a,b,sum,sub1,sub2,and,or,anot,bnot,xor;
printf("文字列a:"); fgets(ax,sizeof(ax),stdin);
printf("文字列b:"); fgets(bx,sizeof(bx),stdin);
//axをaの各ビットに格納
a.bit.b0=ax[0]; a.bit.b3=ax[4];
a.bit.b1=ax[1]; a.bit.b2=ax[5];
a.bit.b2=ax[2]; a.bit.b1=ax[6];
a.bit.b3=ax[3]; a.bit.b0=ax[7];
//bxをbの各ビットに格納
b.bit.b0=bx[0]; b.bit.b3=bx[4];
b.bit.b1=bx[1]; b.bit.b2=bx[5];
b.bit.b2=bx[2]; b.bit.b1=bx[6];
b.bit.b3=bx[3]; b.bit.b0=bx[7];
//演算
sum.bn = a.bn+b.bn; //和
sub1.bn = a.bn-b.bn; //差(a-b)
sub2.bn = b.bn-a.bn; //差(b-a)
and.bn = a.bn&b.bn; //論理積
or.bn = a.bn|b.bn; //論理和
anot.bn = ~a.bn; //aの否定
bnot.bn = ~b.bn; //bの否定
xor.bn = a.bn^b.bn; //排他的論理和
//出力
printf("和_"); output(sum);
printf("差(a-b)_"); output(sub1);
printf("差(b-a)_"); output(sub2);
printf("論理積_"); output(and);
printf("論理和_"); output(or);
printf("aの否定_"); output(anot);
printf("bの否定_"); output(bnot);
printf("排他的論理和_"); output(xor);
return 0;
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
すぱせる
Re: 共用体とビットフィールドを用いた演習
>> softya(ソフト屋) さん
すみません。
こちらを利用するのが久しぶりで、使い方を覚えている気でいました。
フォーラムルールをもう一度読みました。
お手数掛けて申し訳ありません。ご指摘ありがとうございます。
すみません。
こちらを利用するのが久しぶりで、使い方を覚えている気でいました。
フォーラムルールをもう一度読みました。
お手数掛けて申し訳ありません。ご指摘ありがとうございます。
-
かずま
Re: 共用体とビットフィールドを用いた演習
fgets で 8個の数字と 1個の '\n' を読み込んで、さらに '\0' を付けるためには
char ax[10], bx[10]; にしないとだめです。
それから、.b4~.b7 に値を入れていませんよ。
char ax[10], bx[10]; にしないとだめです。
それから、.b4~.b7 に値を入れていませんよ。
-
すぱせる
Re: 共用体とビットフィールドを用いた演習
'\n'の存在を忘れていました!かずま さんが書きました:fgets で 8個の数字と 1個の '\n' を読み込んで、さらに '\0' を付けるためには
char ax[10], bx[10]; にしないとだめです。
それから、.b4~.b7 に値を入れていませんよ。
あと単純な数字のミスです。気取って一行に2つ並べたのが原因で気付けませんでした。
これで解決です!ありがとうございます!
#include<stdio.h>
typedef union{
char bn;
struct{
unsigned int b7:1;
unsigned int b6:1;
unsigned int b5:1;
unsigned int b4:1;
unsigned int b3:1;
unsigned int b2:1;
unsigned int b1:1;
unsigned int b0:1;
}bit;
}string;
void output(string t){
printf("%d",t.bit.b0);
printf("%d",t.bit.b1);
printf("%d",t.bit.b2);
printf("%d",t.bit.b3);
printf("%d",t.bit.b4);
printf("%d",t.bit.b5);
printf("%d",t.bit.b6);
printf("%d",t.bit.b7);
printf("\n");
}
int main(void){
char ax[10],bx[10];
string a,b,sum,sub1,sub2,and,or,anot,bnot,xor;
printf("文字列a:"); fgets(ax,sizeof(ax),stdin);
printf("文字列b:"); fgets(bx,sizeof(bx),stdin);
//axをaの各ビットに格納
a.bit.b0=ax[0]; a.bit.b4=ax[4];
a.bit.b1=ax[1]; a.bit.b5=ax[5];
a.bit.b2=ax[2]; a.bit.b6=ax[6];
a.bit.b3=ax[3]; a.bit.b7=ax[7];
//bxをbの各ビットに格納
b.bit.b0=bx[0]; b.bit.b4=bx[4];
b.bit.b1=bx[1]; b.bit.b5=bx[5];
b.bit.b2=bx[2]; b.bit.b6=bx[6];
b.bit.b3=bx[3]; b.bit.b7=bx[7];
sum.bn = a.bn+b.bn;
sub1.bn = a.bn-b.bn;
sub2.bn = b.bn-a.bn;
and.bn = a.bn&b.bn;
or.bn = a.bn|b.bn;
anot.bn = ~a.bn;
bnot.bn = ~b.bn;
xor.bn = a.bn^b.bn;
printf("和_"); output(sum);
printf("差(a-b)_"); output(sub1);
printf("差(b-a)_"); output(sub2);
printf("論理積_"); output(and);
printf("論理和_"); output(or);
printf("aの否定_"); output(anot);
printf("bの否定_"); output(bnot);
printf("排他的論理和_"); output(xor);
return 0;
}-
すぱせる
Re: 共用体とビットフィールドを用いた演習
囲い間違えました。
#include<stdio.h>
typedef union{
char bn;
struct{
unsigned int b7:1;
unsigned int b6:1;
unsigned int b5:1;
unsigned int b4:1;
unsigned int b3:1;
unsigned int b2:1;
unsigned int b1:1;
unsigned int b0:1;
}bit;
}string;
void output(string t){
printf("%d",t.bit.b0);
printf("%d",t.bit.b1);
printf("%d",t.bit.b2);
printf("%d",t.bit.b3);
printf("%d",t.bit.b4);
printf("%d",t.bit.b5);
printf("%d",t.bit.b6);
printf("%d",t.bit.b7);
printf("\n");
}
int main(void){
char ax[10],bx[10];
string a,b,sum,sub1,sub2,and,or,anot,bnot,xor;
printf("文字列a:"); fgets(ax,sizeof(ax),stdin);
printf("文字列b:"); fgets(bx,sizeof(bx),stdin);
a.bit.b0=ax[0]; a.bit.b4=ax[4];
a.bit.b1=ax[1]; a.bit.b5=ax[5];
a.bit.b2=ax[2]; a.bit.b6=ax[6];
a.bit.b3=ax[3]; a.bit.b7=ax[7];
b.bit.b0=bx[0]; b.bit.b4=bx[4];
b.bit.b1=bx[1]; b.bit.b5=bx[5];
b.bit.b2=bx[2]; b.bit.b6=bx[6];
b.bit.b3=bx[3]; b.bit.b7=bx[7];
sum.bn = a.bn+b.bn;
sub1.bn = a.bn-b.bn;
sub2.bn = b.bn-a.bn;
and.bn = a.bn&b.bn;
or.bn = a.bn|b.bn;
anot.bn = ~a.bn;
bnot.bn = ~b.bn;
xor.bn = a.bn^b.bn;
printf("和_"); output(sum);
printf("差(a-b)_"); output(sub1);
printf("差(b-a)_"); output(sub2);
printf("論理積_"); output(and);
printf("論理和_"); output(or);
printf("aの否定_"); output(anot);
printf("bの否定_"); output(bnot);
printf("排他的論理和_");output(xor);
return 0;
}