question2024
@question2024 (step1engineer)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

javasilver ビット計算

解決したいこと

javasilver紫本にでてくるビットに関する問題の解説を理解したい

ビットの計算について理解できていない問題

問題コード
public class Main{
 public static void main(String[] args){
  int val = 1;
  switch(val){
   case 0:
    System.out.print("X");
   case 1 | 2:  //ここのビット演算子についての計算が理解できない
    System.out.print("Y");
   case 10:
    System.out.print("Z");
  }
 }
}

【問題の答え】
コードは実行されるが、何も出力されない

【解説】
(ビットの部分について抜粋しています)
| はビット演算子です。左辺と右辺をビットで比較し、
どちらかが 1 のときのみ 1 を返し、
それ以外は 0 を返します。
ビットの桁を省略して4ビットで比較します。
1 → 0001
2 → 0010
結果 → 0011
つまり 3 が返ります。

自分の理解

基本情報を勉強したことがあり、
1 → 0001
2 → 0010
(桁省略されている)であることは理解しています。

引っかかっている部分は、
左辺と右辺を比較してどちらかが1のときのみ1を、
それ以外は0をとあるのに、
なぜ左辺と右辺のビットの和をだしているのか、
1か0が返ると書いてあるのに
なぜ3が返るのかわかりません。

どのように考えればよいでしょうか。
ネットで数日間かけて調べてみましたが
自分が調べたいことに合致するサイトを
見つけることができず、
こちらに質問しましたm(_ _)m

0

1Answer

感覚的にビットOR|と論理演算子||を混同されておられると推察します.

ビットOR……2つの整数値を受け取って,ビットごとにORした値を返す.フラグ定数の比較等に用いることがあります.
例) 0100 | 1001 = 1101

論理演算子||……2つのbool値を受け取り,どちらかがtrueを返すならtrueとなる.2条件の比較に用います.

例)
false || SomeShouldReturnTrue() = true

通常は,意味合い的に 「1と2をbool比較する」状況は起こりえないことに注意してください .1 | 2ではただ数値の計算をしているだけであると理解すると良いです.

1Like

Comments

  1. @question2024

    Questioner

    コメントありがとうございます!
    おっしゃっていただいた通りで、混合していました💦
    対応するビットごとにOR演算を⾏うことの意味が今わかりました。
    この気づきを元に先ほどネットで似たよな問題を探せたので
    解いてみたところ正解だったので、
    ここで理解できた!と思います。
    早速ありがとうございました!!m( _ _)m

Your answer might help someone💌