c语言无符号整型除法,用位运算的方法实现无符号整数的除法,游戏编程 | 李大仁博客...
相信知道除法的作用的人都知道除法怎么來計算吧,不過計算機計算除法的方法可能優點浪費資源了以下是使用位計算轉換除法的過程,相信知道游戲編程的朋友對這個應該不陌生吧
原理:假如要實現A/B,B如果是2的整數次方的話,那就不用說的,直接位移了運算如果是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);
}
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 ;循環
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。試商:將被除數和除數左對齊,看看被除大于等于除數的幾倍,得到當前商,因為是十進制數,故當前商為0-9.
2. 將被除數減去除數的當前商?倍.
3. 被除數左移1位,轉第一步,繼續試商。
然后 看二進制除法,和十進制除法手算類類似,二進制除法也需3步,不過更加簡單。
1. 試商,因為是二進制數,故 當前商 為0-1. 被除數大于除數,當前商 置1,小于除數,當前商 置0
2。被除數 減去 除數的 當前商 倍。當前商為1,被除數減去除數。否則,被除數不變。
3. 被除數 左移1位(二進制的移位),繼續 第1步.
總結
以上是生活随笔為你收集整理的c语言无符号整型除法,用位运算的方法实现无符号整数的除法,游戏编程 | 李大仁博客...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《通信原理》多径衰落信道仿真1
- 下一篇: Linux 10GE端口,问GE和10G