- ベストアンサー
計算できない
Javaのソースで int n = 56; n = n & n + 1 | n + 2 ^ n + 3; System.out.println(n); の出力がなぜ58になるのかが全く理解できません。 どなたかわかる方お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>失礼しました。最後の+3というのが余計でした。 >上記のソースではnは57になります。 つまり n = n & n + 1 | n + 2 ^ n; が57になる理由ということでしょうか。 説明しますと、これは「演算子の優先順位」の違いでこうなります。 たとえば、足し算とかけ算なら、 足し算の方が先にあってもかけ算の方が優先されます。 2 + 3 * 4は20ではなくて14になります。これはよくありますね。 四則演算以外にも、Javaでは「何の計算を優先させるか」が決まっています。 優先順位の表(たとえばアスキー『ジャストJava2』の135pに載っています)を見ると、 ここに出てくる演算子の優先順位は、+, &, ^, |の順になっています。だから n & n + 1 | n + 2 ^ n; は (n & (n + 1)) | ((n + 2) ^ n); と計算されます。 数値をあてはめてみると、 (56 & 57) | (58 ^ 56) となりますね。 この式に出てくる演算子 & | ^ は、ビット単位の演算子です。 &はビット論理積(二つの数値のビットを調べ、両方1になったら1とする) |はビット論理和(どちらかが1なら1とする) ^はビット排他的論理和(ビット値が違うところだけ1とする) です。 これらを考えるときは数値をビット(2進数)に直して考えます。 たとえば56は111000となります。 式をビットで表してみると、 (111000 & 111001) | (111010 ^ 111000) ↓ 111000 | 000010 ↓ 111010 となり、これを10進数で表すと58になります。
その他の回答 (2)
> n = n & n + 1 | n + 2 ^ n + 3; > System.out.println(n); > の出力がなぜ58になるのかが全く理解できません。 (1) 演算子の意味がわからないのなら、リファレンスや書籍に書いてあることです ので、質問以前の問題です。 (2) 演算子の優先結合順位がわからないのなら、わかりやすくするように括弧を 付けるべきです。 (上記の右辺式を一見して結合順序が即座にわかる人は少ないと思います) (3) 上記(1)、(2)の両方を理解した上で結果が理解できないなら、すべて2進数 表記で紙に書いて計算をトレースすれば理解できるはずです。
- liar_adan
- ベストアンサー率48% (730/1515)
すみません。該当部分をコピー&ペーストして試したら、 うちの環境では57になったのですが…。 もう一度ご確認できませんか? (57でよければ説明できるのですが)
補足
失礼しました。最後の+3というのが余計でした。 上記のソースではnは57になります。
お礼
わかりやすい解説ありがとうございました。 おかげで解決しました。