剰余は2冪の値ならAND演算で表現できる
リングバッファを実装する際に便利なプログラミング技法。
https://ufcpp.net/study/algorithm/col_circular.html
code:awk
#!/usr/bin/awk -f
{
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の値をビットマスクとして利用することで、剰余と同じ効果が得られる。