バイナリで表された任意の整数では、任意の 2 のべき乗による除算の剰余は、単純に下位のビットの値であり、0b11001110
除算された0b1000
剰余があり0b110
ます。したがって、8 で割り切れるかどうかを確認するには、下位 3 ビットがすべてゼロかどうかを確認する必要があります。
if (((x >> 3) << 3) == x)
divisibleBy8 = true;
右シフトは、左シフトが大きさを復元する前に下位 3 ビットをクリアし、元の数値と比較します。
他の人が指摘したように、整数のビット幅を知っていれば、これを行うことができます
if (!(x<<29))
divisibleby8 = true;
その 29 を 64 ビット整数などの 61 に置き換えます。どうやら Java ではこれを行うことができます。
if ((x << -3) != 0)
divisibleby8 = true;
などの負のシフトは として-3
解釈されbit_width - 3
、32 ビット整数と 64 ビット整数の両方で機能するためです。
(すべての括弧は必要ありません。わかりやすくするために含めました)
完全を期すために
これらはすべて、8 で割り切れるif !(x & 7)
かどうかをテストするための非常に悪い方法です。