• ベストアンサー

if ( a & b == b )

aはビットフラグで、メモリ、FDD、HDD、FANなどの故障状態を表しています。 bは条件です。FDDとHDDが両方故障なら2進で11です。 FDDとHDDが両方故障であるのを得るために2進の11がdefineしてあるのは変更できませんが、FDDとHDDが両方故障であるのを調べるために if ( a & b == b ) を実行するのには何か無駄がある気がしますが、もっとよい方法はありますか?

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

> if((a^b) ==0) または if(!(a^b)) a^bが0になるのはaとbが等しいときですから、 これは以下のif文と同じことになります。 > if(a==b) これはたぶん、質問の意図とは違う動作だと思います。 # なお、==や!演算子は^演算子よりも優先順位が高いので # ^を先に演算させたいならかっこが必要です。 私もちょっと考えて、if(!(~a&b)) が思いつきましたが あまり効率が良さそうでもないですね。 (これならif((a&b)==b)の方がまだ意図が分かりやすい分良さそうです。)

letrmf
質問者

お礼

処理速度は速かったので効率は悪くないと思いますよ。

その他の回答 (3)

回答No.4

括弧のつけ忘れや、多分、実際の変数名は a や b じゃないですよねというのはありますが、この書き方は、ハードウエアに関わるソフトでは、よく見られる書き方です。 ですから、無駄があるというより、この標記なら、一発で意図が理解してもらえるという利点をどう考えるかになるでしょう。

letrmf
質問者

お礼

今回は速さ重視で作ろうとしています。 ソースの読みやすさはあきらめました。

  • myfrend
  • ベストアンサー率37% (17/45)
回答No.2

1bitづつビットフィールドで参照するか、 排他的論理和で見るのがいいと思います。 使用メモリも少なく、実行ステートも早くなります。   if(a^b ==0) または if(!a^b)

letrmf
質問者

お礼

ありがとうございます。 if(!a^b) はよいですね。 質問が不足していました。 FDDとHDDが両方故障であるのを調べるために ↓ 少なくともFDDとHDDが両方故障であるのを調べるために このように訂正します。 そうすると if(!((a&2)^b)) ですよね?こちらの方が速かったのでこれを使おうと思います。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

if ( (a & b) == b )の間違いでは?

letrmf
質問者

お礼

はい、質問文にかっこが不足しています。

関連するQ&A