重複の可能性:
ビット単位およびモジュラス演算子の代わり
誰かが両方の式を同等にする理論的根拠を説明できますか?64は2の累乗であるため、機能するだけですが、論理的または数学的に除算からビット単位に移行するにはどうすればよいでしょうか。
重複の可能性:
ビット単位およびモジュラス演算子の代わり
誰かが両方の式を同等にする理論的根拠を説明できますか?64は2の累乗であるため、機能するだけですが、論理的または数学的に除算からビット単位に移行するにはどうすればよいでしょうか。
を 64 で割ると、この演算x % 64
は剰余を返しますx
。これは (x>0 と仮定して) 0 から 63 の間の数値でなければなりません。これを 2 進数で見てみましょう。
10月63日= 0011 1111 b 10月
64日= 0100 0000 b
64 の倍数のバイナリ表現は、6 つのゼロで終わらなければならないことがわかります。したがって、任意の数値を 64 で割った余りは元の数値で、右端の 6 ビットを除くすべてのビットが削除されます。
数値と 63 のビットごとの AND を取ると、結果はまさにその 6 ビットになります。
ビットシフトを行うたびに、これは2で割るのと同じです。これは、2進表現が基数2であるためです。これは、基数10の123から3を削除すると12になるのと同じ方法で、123を10で割るようなものです。
%はmod演算子であり、除算の余りを意味します。64は2の6乗であるため、64で除算することは6ビットをシフトアウトするようなものです。除算の余りは、シフトアウトした6ビットです。6ビットの値は、ビット単位で実行することで見つけることができます。下位6ビットのみを設定すると63になります。
最初のものは残りを与えます。
2つ目は短絡です(ビット単位のAND)。
ビット単位のANDでは、63(バイナリでは111111)であるため、LHS(x)にあるものはすべてアンディングされ、MSBを除いて同じになります。答えは、64(バイナリ100000)の%の場合であり、除算され、MSBは同じままです。