• ベストアンサー

C言語 while

int REG1,REG2; while ((REG1 & 0x04) || (REG2 & 0x1f)); これはどのような意味(動作)なのか教えてください わからないなりに推測すると 1.((REG1 & 0x04) || (REG2 & 0x1f)) はループを抜けるための判定式で   ループ内の文は";"で文がないので判定式が成立したら   ループを抜ける 2.REG1=REG1 & 0x04  REG2=REG2 & 0x1f  ビット演算 3."||" は論理演算の"OR"とのことですが意味がわかりません   REG1=0x04 REG2=0x02 なら REG1 || REG2 は0x06 なのですか? 4.3.がわからないので全体としての意味がわからない次第です

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6871/9771)
回答No.1

>1.((REG1 & 0x04) || (REG2 & 0x1f)) はループを抜けるための判定式で 「ループを抜けるため…」はそうなんですが、ここは正確に理解しましょう。 この条件が成立している間、whileブロック内を繰り返し実行します。 >2.REG1=REG1 & 0x04  REG2=REG2 & 0x1f  ビット演算 確かにビット演算です。 ただ、代入はしていないので、ループチェックの為だけの演算をしています。 0x04 は16進数表記ですが、2進数で言うと 00000100 になりますね。 つまり (REG1 & 0x04) が真になるのは、REG1に入っている数値を2進数表記したとき、右から3ビット目が1になっている場合です。 その他のビットは判定に影響しません。 ※というか、「REG1」という変数名から想像すると、何らかの状態がビットごとに定義されているポートの値を読み取っていて、その第3ビットに注目して判定している(他のビットは0だろうが1だろうが関係ない)、ということでしょうね。 (REG2 & 0x1f) も同じような考え方になります。 0x1fは2進数表記で 00011111 ですから、数値の下位5ビットを判定のために取り出していることになります。 上位ビットに関わらず、下位5ビットが0以外(数値で言うと1~31)であるときに、真となります。 ※こちらは測定値か何かが出力されているポートでしょうか。ただ、出力値として0~31が定義されているけれども、上位ビットは不定(または他の用途に使われている)ことが想像されます。 そこで、下位5ビットのみを取り出す書き方として「& 0x1f」としていると。 さて、whileでは、式の値を直接ループ判定に使った場合、0以外=真(ループする)、0=偽(ループを抜ける)となります。 それにおいて、上記の REG1の判定とREG2の判定が or で接続されていますから、 「REG1の3ビット目が1である」または「REG2の下位5ビットが0ではない」間、ループし続けます。 逆に言うと、 「REG1の3ビット目が0」かつ「REG2の下位5ビットもすべて0」となった時、ループを抜けます。

Kuma2000
質問者

お礼

回答ありがとうございます。 私のような初心者にも 「疑問の余地がない」すばらしい回答 でした。

Powered by GRATICA
すると、全ての回答が全文表示されます。

関連するQ&A