• ベストアンサー

論理演算について

Cを勉強中の者です。論理演算についてよくわからいことがあります。 以下のソースコードを実行し結果が真なら0001、偽なら0000が出力されるプログラムを作りました。 #include <stdio.h> int main(void) { unsigned short a = 0x1234; unsigned short b = 0xfafc; unsigned short c = 0xcdef; unsigned short x, y; x = a && b; y = b && c; printf("x=%04x\n", x); printf("y=%04x\n", y); return 0; } 結果はx=0001, y=0001となります。y=0001はbとcの文字列がそれぞれfとcをを持っているので演算による結果は納得できますが、x=0001はaとbの文字列には共通するものがないのになぜx=0000ではないのでしょうか? また0xが頭に付く表現は16進数だと強調するためにあるのですか? 説明に不足があればまた足しますのでよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

まず認識間違いを >y=0001はbとcの文字列 >x=0001はaとbの文字列には aもbもcも「数値」です。「文字列」ではありません。 >y=0001はbとcの文字列がそれぞれfとcをを持っているので演算による結果は納得できますが 「代入している内容の一部に同じ『文字』があるから」 というおかしな考え方で納得していませんか? >共通するものがないのになぜx=0000ではないのでしょうか? a~cまでは「0」ではないため「真」の扱いです。 「真 && 真」なら、導きだされる解は「真」です。 >また0xが頭に付く表現は16進数だと強調するためにあるのですか? 強調ではなく「仕様」です。 そうでないと8/10/16進数の区別がつきません。

shomarket
質問者

お礼

結果が0でなけれ真ということですね。真 && 真 とう書き方で納得しました。aもbもc 0ではないから 真 && 真の結果は真で0001ということですね。理解しました。ありがとうございます。

その他の回答 (5)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.6

ビット単位でみた論理演算の過程を示します。 a = 0x1234 = 0001 0010 0011 0100 b = 0xFAFC = 1111 1010 1111 1100 c = 0xCDEF = 1100 1101 1110 1111 a && b =   0001 0010 0011 0100 && 1111 1010 1111 1100 --------------------------   0001 0010 0011 0100 = 0x1234 --> 0(偽)ではないので真 以下、エンディアンって何?と思ったら無視してください。 上記の例はビッグエンディアンを仮定しました。リトルエンディアンの場合ビットの並び方が変わるのでご注意を。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

a,b,cとも数値であって文字列ではありません。文字判断をしたいなら相応の処理が必要です。 また&&の演算結果はともに真(非0)なら真を返しますから、a&&b, b&&c, a&&cいずれも真です。 なお > 0xが頭に付く表現 は「16進表記であることを示すもの」です。 強調ではなく0xがないと16進表記であることをコンパイラは判断できません。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

aもbもcも文字列ではありません。数値です。 また、&&を使っているので、ビット演算ではありません。ただの論理演算です。 cでは0が偽、0以外が真として扱われます。 なので、a&&bは真アンド真なので、真です。 cで、真を数値に変換すると、1になりますので、 xの値は1となります。 yも同様。 論理演算ではなくビット演算を行いたい場合は&&ではなく&を使います。 >また0xが頭に付く表現は16進数だと強調するためにあるのですか? 強調ではなく、16進数で書くためには、必ず0xをつけなくてはなりません。

shomarket
質問者

お礼

なるほど、少し頭の中を整理することができました。結果が0でなければ真であると考えてよいわけですね。ありがとうございました。

回答No.2

ちなみに論理演算である場合文字列で見るわけではないので >bとcの文字列がそれぞれfとcをを持っている という解釈はおかしいです。 0x1234 は2進数表示だと 1001000110100 0xfafc は2進数表示だと 1111101011111100 となり論理和は 0001001000110100 1111101011111100 ---------------- 0001001000110100 → 0x1234 となります。 0xfafcと0xcdefの論理和はご自分で考えてみてください。

回答No.1

>x = a && b; >y = b && c; & では? && だと x : a かつ b → aは真、bも真なのでxは真になる→数値で1。 y : xと同様。

関連するQ&A