ページ 11

共用体とビットフィールドを用いた演習

Posted: 2012年6月16日(土) 17:42
by すぱせる
共用体を用いてビット単位で操作できる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;
}

Re: 共用体とビットフィールドを用いた演習

Posted: 2012年6月16日(土) 17:51
by softya(ソフト屋)
もう一つの質問もですがフォーラムルールをお読みください。 http://dixq.net/board/board.html
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;
}

Re: 共用体とビットフィールドを用いた演習

Posted: 2012年6月16日(土) 17:55
by すぱせる
>> softya(ソフト屋) さん
すみません。
こちらを利用するのが久しぶりで、使い方を覚えている気でいました。
フォーラムルールをもう一度読みました。
お手数掛けて申し訳ありません。ご指摘ありがとうございます。

Re: 共用体とビットフィールドを用いた演習

Posted: 2012年6月16日(土) 19:30
by かずま
fgets で 8個の数字と 1個の '\n' を読み込んで、さらに '\0' を付けるためには
char ax[10], bx[10]; にしないとだめです。
それから、.b4~.b7 に値を入れていませんよ。

Re: 共用体とビットフィールドを用いた演習

Posted: 2012年6月16日(土) 20:46
by すぱせる
かずま さんが書きました:fgets で 8個の数字と 1個の '\n' を読み込んで、さらに '\0' を付けるためには
char ax[10], bx[10]; にしないとだめです。
それから、.b4~.b7 に値を入れていませんよ。
'\n'の存在を忘れていました!
あと単純な数字のミスです。気取って一行に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: 共用体とビットフィールドを用いた演習

Posted: 2012年6月16日(土) 20:49
by すぱせる
囲い間違えました。

コード:

#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;
}