共用体とビットフィールドを用いた演習
Posted: 2012年6月16日(土) 17:42
共用体を用いてビット単位で操作できる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;
}
「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;
}