アプリ版:「スタンプのみでお礼する」機能のリリースについて

if(flag[m][c] & (1 << (i&1)))
という条件があるのですが、意味がわかりません。
詳しく教えてください。
<<のシフトについては理解してます。

また、
flag[m][c] |= << (i&1);

flag[m][c] ^= << (i&1);

flag[m][c] |= << 1 | 2;

について詳しく教えてください。
お願いします。

A 回答 (2件)

flag[m][c] & (1 << (i&1))


の場合

iの値によって
flag[m][c] & (1 << 0) または flag[m][c] & (1 << 1)
と展開されます
flag[m][c] & 1 か flag[m][c] & 2
といった具合になります

つまり i & 1 は偶数なら 0に 奇数なら1に するといった式です

flag[m][c] |= << (i&1);
flag[m][c] ^= << (i&1);
flag[m][c] |= << 1 | 2;
って << の前に 1 があるのでしょうか?

flag[m][c] |= 1 << (i&1);
flag[m][c] ^= 1 << (i&1);
は前述の展開後 OR演算 ExOR演算を行います

flag[m][c] |= 1 << 1 | 2;

flag[m][c] |= 2 | 2;
flag[m][c] |= 2;
といった展開になりそうです
<<のほうが |より演算子の優先順位が高いため ・・・
    • good
    • 0

全てビット演算です。



&は論理積(AND)、|は論理和(OR)、^は排他的論理和(XOR)をビット単位で計算します。

たとえばi & 1は1を8桁2進表記すると00000001なので、iの1bit目が立っていれば00000001、そうでなければ00000000になります。

あとは式を一つ一つ分解していけば何やってるのかが見えてくることでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!