banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[アルゴリズム] 位演算を使用した方法による符号なし整数の除算の原理とプログラムの実装

除算の目的を理解している人は、除算の計算方法を知っているでしょう。ただし、コンピュータの除算の方法はリソースをいくらか浪費する可能性があります。以下はビット演算を使用した除算の変換プロセスです。ゲームプログラミングに詳しい友人なら、これには馴染みがあるはずです。

原理:A/B を実現する場合、B が 2 のべき乗である場合は、ビットシフト演算を使用して計算することができます。B が 0 の場合、A/0 は何になるかはわかりません。

コード:

bitDivide(){
if(B==0) error(0);//B=0
while(B >> 1){
int count;
count ++;
if (B==0) output(A >> count) ;//Log2^B=0
}
int r = count + 32; //32 は非常に重要な数字で、32 ビットマシンに適しています
float f = 2 ^ r / B;
float t = f - (int) f; // 小数部分を取得
float result;
if(t>0.5)
result=(A * f >> r) - (A >> count);
else if(t<0.5)
result=(( A + 1 ) * f >> r)-(A >> count);
else error(0);
output(result);
}

説明
まず、B の最上位ビットを取得します(max(log2^B))。
次に、この b に 32 を加えます。32 は非常に重要な数字で、32 ビットマシンに適しています。
仮に r = 32 + b とします。
次に、f = 2^r / B を計算します。
f の小数部分 t を取得します。
t <0.5 の場合、結果は (((A+1) * f) >> r)-(A>>count) です。
t > 0.5 の場合、結果は ((A*f) >> r)-(A>>count) です。
t = 0.5 の場合、エラーです。

付記:整数除算のアセンブリソースコード、CSDN より

mov     cx,16   ;結果は16ビットで、16回繰り返す

start:
SHL AX , 1 ; 被除数を左に 1 ビットシフト
RCL DX , 1
CMP DX , BX ; 商を試す
JB next ; 現在の商が 0 の場合、処理しない
SUB DX , BX ; 指数を引く
OR AX , 1
next: loop start ; 繰り返し

基本的な考え方:手計算の階法を思い出すことができます。

  1. 商を試す:被除数と除数を左に揃え、被除数が除数の何倍以上かを見て、現在の商を得ます。10 進数の場合、現在の商は 0 から 9 の範囲です。
  2. 被除数から除数の現在の商の倍数を引きます。
  3. 被除数を左に 1 ビットシフトし、第 1 ステップに戻り、試商を続けます。

次に、2 進数の除算を見てみましょう。10 進数の除算と手計算が似ていますが、2 進数の除算はさらに簡単です。

  1. 試商を行います。2 進数の場合、現在の商は 0 または 1 です。被除数が除数よりも大きい場合、現在の商を 1 に設定し、除数よりも小さい場合は現在の商を 0 に設定します。
  2. 被除数から除数の現在の商の倍数を引きます。現在の商が 1 の場合、被除数から除数を引きます。そうでない場合、被除数は変わりません。
  3. 被除数を左に 1 ビットシフト(2 進数のシフト)し、第 1 ステップを繰り返します。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。