剰余は2冪の値ならAND演算で表現できる
code:awk
{
size = 1024
a = $1 % size
b = and($1, size - 1)
printf "%d: %d %d\n", $1, a, b
}
code:txt
87654
87654: 614 614
98765
98765: 461 461
除数に相当する部分のビット列を考える
最下位ビットから数えて1が連続で並ぶ最上位の桁より上位の桁は全て0
...000011111111
これにいくらAND演算しても結果は除数以上の大きさにはならない(切り捨てされる)
しかし、それ以下の桁は被除数と同じ値になる
結果として、値に対して2冪の除数-1の値をビットマスクとして利用することで、剰余と同じ効果が得られる。