剰余演算
剰余演算は、除算を行って余りを得る実装となるので、その分の処理時間を必要とする。特殊な場合においては、いくつかのハードウェア上でより高速な計算方法が存在する。
たとえば、数値の内部表現に2進法を用いているコンピュータでは、2のべき乗の剰余を計算する場合に、下記のようにビットごとのAND演算を利用することができる。
x % 2 == x & (2 - 1)
例を示す(x は正の整数とする)。
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
剰余演算よりもビット演算のほうが効率よく処理できるデバイスやソフトウェアでは、この変換によってより高速に計算することができる。
最適化をする コンパイラには、2のべき乗による剰余演算を検出し、自動的にAND演算に変換するものもある。これによって、プログラマは性能を犠牲にすることなく、読みやすいソースコードを記述することができる。ただし、AND演算による場合、出力は常に正の数となるので、C言語のように剰余演算の結果の符号が被除数によって定まる言語では同じ動作はしない。したがって、被除数が負になる場合は、特別な注意が必要である。
n > 0 ⇒ q = ⌊ a n ⌋ {\displaystyle n>0\Rightarrow q=\left\lfloor {\frac {a}{n}}\right\rfloor } n < 0 ⇒ q = ⌈ a n ⌉ {\displaystyle n<0\Rightarrow q=\left\lceil {\frac {a}{n}}\right\rceil } また、符号関数 sgn を使用すると、下記のようにも表せる。 q = sgn  ( n ) ⌊ a | n | ⌋ {\displaystyle q=\operatorname {sgn}(n)\left\lfloor {\frac {a}{\left|n\right|}}\right\rfloor } r = a − | n | ⌊ a | n | ⌋ {\displaystyle r=a-|n|\left\lfloor {\frac {a}{\left|n\right|}}\right\rfloor }
Common Lispでは切り下げ除算、切り上げ除算のそれぞれについてq = round(a/n) と q = ceil(a/n) で商が与えられる。
IEEE 754-1985 の剰余は、近接丸め(英語版)を行った場合の商として定義している。したがって、剰余の符号は「0に近い側」となる。
Daan Leijenはこのように記している。