
数学では、2 で割る、つまり半分にすることは、メディエーションまたはディミディエーションとも呼ばれています。[ 1 ]これを他の数による乗算や除算とは異なる演算として扱うことは、古代エジプト人にまで遡り、彼らの乗算アルゴリズムでは、基本的なステップの 1 つとして 2 による除算を使用していました。[ 2 ] 16 世紀になっても、一部の数学者は半分にすることを別の演算と見なし続けていて、[ 3 ] [ 4 ]現代のコンピュータプログラミングでも、多くの場合、個別に扱われ続けています。[ 5 ] この演算は、10 進演算、コンピュータプログラミングで使用される2 進数システム、およびその他の偶数基数では簡単に実行できます。奇数を 2 で割るには、数学的解法( ( N −1)÷2)+0.5 を使用します。たとえば、N = 7 の場合、((7−1)÷2)+0.5=3.5 となるため、7÷2=3.5 となります。
2 進算術では、2 で割る演算は、数を 1 つ右にシフトするビット シフト演算によって実行できます。これは強度削減最適化の一形式です。たとえば、2 進数の 1101001 (10 進数の 105) を 1 つ右にシフトすると、110100 (10 進数の 52) になります。この場合、最下位ビットの 1 が削除されます。同様に、2 の任意の累乗2 kによる除算は、 k桁を右にシフトすることによって実行できます。ビット シフトは除算よりもはるかに高速な演算であることが多いため、このように除算をシフトに置き換えることは、プログラム最適化の有効なステップとなる可能性があります。[ 5 ]ただし、ソフトウェアの移植性と可読性を考慮すると、除算演算を使用してプログラムを作成し、この置き換えをコンパイラに任せるのが最善の場合がよくあります。[ 6 ] Common Lispからの例:
( setq番号#b1101001 ) ; #b1101001 — 105 (灰の番号-1 ) ; #b0110100 — 105 >> 1 ⇒ 52 (灰の番号-4 ) ; #b0000110 — 105 >> 4 ≡ 105 / 2⁴ ⇒ 6しかし、上記の記述は、符号付き2進数の除算を扱う場合には必ずしも当てはまりません。1ビット右にシフトすると2で割ることになり、常に切り捨てられます。しかし、一部の言語では、符号付き2進数の除算は0に向かって丸められます(つまり、結果が負の場合は切り上げられます)。例えば、Javaはそのような言語の1つです。Javaでは、-3 / 2は と評価されます-1が、 は と-3 >> 1評価されます-2。そのため、この場合、被除数が負になる可能性があるにもかかわらず、コンパイラは2による除算をビットシフトに置き換えることで最適化すること はできません。
二進浮動小数点演算では、指数を1減らすことで2で割ることができます(ただし、結果が非正規数にならない限り)。多くのプログラミング言語では、浮動小数点数を2のべき乗で割るための関数が提供されています。例えば、Javaプログラミング言語は2のべき乗でスケーリングする方法を提供しjava.lang.Math.scalb、[ 7 ]、Cプログラミング言語ldexpも同じ目的の関数を提供しています。 [ 8 ]
以下のアルゴリズムは10進数用です。ただし、任意の偶数基数Nの半分を求めるアルゴリズムを構築するためのモデルとして使用できます。
| 最初の数字が | 平 | 平 | 平 | 平 | 平 | 奇数 | 奇数 | 奇数 | 奇数 | 奇数 |
|---|---|---|---|---|---|---|---|---|---|---|
| そして2桁目は | 0または1 | 2または3 | 4または5 | 6または7 | 8または9 | 0または1 | 2または3 | 4または5 | 6または7 | 8または9 |
| 書く | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
例: 1738/2=?
01738 と書きます。次に、結果を求めます。
結果: 0869。
この例から、 0 は偶数であることがわかります。
Nの最後の桁が奇数の場合は、結果に 0.5 を加算する必要があります。