#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_BYTE 255 /*8ビットで表現できる最大値*/ enum OP{ AND = '&',OR = '|' ,XOR = '^',NOT = '~'}; int main(void) { unsigned char line[256],op[2]; /*入出力バッファ・演算子格納*/ unsigned char *p; /*出力バッファワークポインタ*/ unsigned d1,d2,result; /*被演算数・結果*/ unsigned mask=0x0001; /*マスクパターン*/ int ret,shift,save; /*戻り値セーブ・ビットカウンタ*/ for(;;) /*無限ループ*/ { op[0]='\0',p=&line[0]; /*変数初期化*/ printf("\n> "); /*プロンプト表示*/ gets(&line[0]); /*1行入力*/ ret=sscanf(&line[0],"%1s%i",op,&d2); /*単項演算で読み込む*/ if((ret==2)&&(op[0]==NOT)) { result = ~d2; /*否定演算実行*/ shift=save=(d2>MAX_BYTE)? 16:8; /* 16/18ビット幅を決定*/ } else if((op[0]=='q') || (op[0]=='Q')) /*終了か?*/ { exit(EXIT_SUCCESS); } else { /*** 2項演算として読み込み直す***/ if(sscanf(&line[0],"%i%1s%i",&d1,op,&d2) != 3) { continue; /*入力不正*/ } switch(op[0]) { case AND: result=d1&d2; break; /*論理積*/ case OR: result=d1|d2; break; /*論理和*/ case XOR: result=d1^d2; break; /*排他的論理和*/ default: continue; /*入力誤り*/ } shift=save=((d1>MAX_BYTE) || (d2>MAX_BYTE))?16:8;/*ビット幅決定*/ strcpy(p,"\n\t "); /***第1項を文字列で2進化し、バッファに格納する***/ for(p=&line[strlen(&line[0])];shift>0;shift--) { *p++ = (d1 & (mask<<(shift-1)))? '1':'0'; } } result &=(save==8)? 0x00ff:0xffff; printf("---> %X(hex) / %u(dec)",result,result); /*答えの表示*/ strcpy(p,"\n\t%c)"); /*演算子設定用出力*/ /***第2項(否定では第1項)を文字列で2進化し、バッファに格納する***/ for(shift=save,p=&line[strlen(&line[0])];shift>0;shift--) { *p++ = (d2 & (mask<<shift-1))? '1':'0'; } strcpy(p,"\n\t "); /***線を引く***/ for(shift=save,p=&line[strlen(&line[0])];shift>=0;shift--) { *p++ = '-'; } strcpy(p,"\n\t "); /***演算結果を文字列で2進数化し、バッファに格納する***/ for(shift=save,p=&line[strlen(&line[0])];shift>0;shift--) { *p++ = (result & (mask<<shift-1))? '1':'0'; } strcpy(p,"\n"); /*バッファ設定完了*/ printf(&line[0],op[0]); /*バッファを書き出す*/ } return EXIT_SUCCESS; }
C言語によるプログラミング 応用編という本で、ビットごとの論理演算の2進数演算形式表示というプログラムから質問です。
strcpy(p, や *p++=
として文字列をpにコピーや代入をしていますが、どうしてそれが最後のprintfで表示になるのでしょうか。
この操作をする度にpの値が変わるのではないかと思います。
表示させるにはその都度、printfをしなければならないのかと思っています。
もう一つお伺いします。
if(sscanf(&line[0],"%i%1s%i",&d1,op,&d2) != 3)
この %i というのは %d と同じと解釈して良いのでしょうか。
表記が違うので、何か異なる意味があるのでしたら教えてください。
2016/08/06 追記 実行結果
$ ./a.out > 3&10 ---> 2(hex) / 2(dec) 00000011 &)00001010 --------- 00000010 > 3|10 ---> B(hex) / 11(dec) 00000011 |)00001010 --------- 00001011 > 3^10 ---> 9(hex) / 9(dec) 00000011 ^)00001010 --------- 00001001 > ~3 ---> FC(hex) / 252(dec) ~)00000011 --------- 11111100 > q $
2016/08/06 追記
もう一つ、質問がありました。
if-else文が終わってから、
strcpy(p,"\n\t%c)"); //疑問点
この文で%cとあり、今回のプログラムでは、& | ^ ~ のどれかが表示されるのですが、
例えば、
int a=10; printf("%d",a);
のように、変換指定と、それに対する引数が必要だと思うのですが、上の疑問点には、引数が無いのになぜ、表示されるのでしょうか。
以上は分かりましたが、新たに疑問がありますので、ご回答よろしくお願いします。
2018/02/06 追記
新たな疑問が出たので、ご回答ください。
result &=(save==8)? 0x00ff:0xffff;
この文は無くても動きましたが、どのような意味があるのでしょうか。
8ビットの場合と16ビットの場合で、ANDマスクしていますが、意味が分かりません。
resultはすでに先の演算で値ができているのに、それをあえてAND演算するのか、疑問です。
回答4件
あなたの回答
tips
プレビュー