C言語では、&,|,^ , <<, >>
の優先順位が四則演算や比較演算に対し紛らわしい
順位にあります。
とくにアセンブラの感覚/優先順位で用いると勘違いしやすいように思えます。
ビット演算子やシフト演算子は、速度や命令サイズの効率から
(とくにアセンブラ経験者は)
2の乗数の性質を利用した掛算や割算・余算の代用としてよく用いるので、
掛算や割算と同様の優先順位を期待したいところなのです。
が、実際のC言語では、<<,>> が+,-,より優先順位が下だったり、&,|,^
が >,>=,<,<=,==,!=より下だったり、さらに&,|,^間でも優先順位がちがったり、と、気をつけないと
かなり思い違いをし兼ねないしろものです。
なので、このようなものを用いるときは明示的に()をつけて対処したほうがよいです。
たとえば、
a = c >> 8 + 1;
や
if (a & b == 0)
と書かれてあった場合、文法的には
a = c >> (8 + 1);
や
if (a & (b == 0))
なのですが、記述者は
a = (c >> 8) + 1;
や
if ((a & b) == 0)
のつもりだった可能性があります。
たとえ、わかっていて前者のつもりで書いたとしても、
この手のものはとくに、他の人が見た場合に、正しいのか誤記なのか判断しずらく、
念のために記述者に確認を取る等の手間が増えるので、余計な手間を減らす意味でも、
意図を明確にするために () をつけるべきでしょう。