c语言无符号整型除法,用位运算的方法实现无符号整数的除法,游戏编程 | 李大仁博客...
相信知道除法的作用的人都知道除法怎么來計(jì)算吧,不過計(jì)算機(jī)計(jì)算除法的方法可能優(yōu)點(diǎn)浪費(fèi)資源了以下是使用位計(jì)算轉(zhuǎn)換除法的過程,相信知道游戲編程的朋友對這個(gè)應(yīng)該不陌生吧
原理:假如要實(shí)現(xiàn)A/B,B如果是2的整數(shù)次方的話,那就不用說的,直接位移了運(yùn)算如果是0,這個(gè)就不要問我了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這個(gè)數(shù)字很重要,適合32位機(jī)器運(yùn)算
float f = 2 ^ r / B;
float t = f - ( int ) f; //取小數(shù)部分
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這個(gè)數(shù)字很重要,適合32位機(jī)器運(yùn)算
float f = 2 ^ r / B;
float t = f - ( int ) f; //取小數(shù)部分
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)
然后讓這個(gè)b加上 32 ,32這個(gè)數(shù)字很重要,適合32位機(jī)器運(yùn)算
假設(shè)一個(gè) r = 32 + b
再計(jì)算 f = 2^r / B,
再取 f的小數(shù)部分t
t < 0.5 , 結(jié)果為 (((A+1) * f) >> r)-(A>>count)
t > 0.5 , 結(jié)果為 ((A*f) >> r)-(A>>count)
t = 0.5, 錯(cuò)誤
附:機(jī)器實(shí)現(xiàn)整數(shù)除法的匯編源程序,來自CSDN
mov cx,16 ;結(jié)果為16位,循環(huán)16次
start:
SHL AX , 1 ;被除數(shù)左移1位
RCL DX , 1
CMP DX , BX ;試商
JB next ;當(dāng)前商為0,不處理
SUB DX , BX ;減去階數(shù)
OR AX , 1
next: loop start ;循環(huán)
mov cx,16 ;結(jié)果為16位,循環(huán)16次
start:
SHL AX , 1 ;被除數(shù)左移1位
RCL DX , 1
CMP DX , BX ;試商
JB next ;當(dāng)前商為0,不處理
SUB DX , BX ;減去階數(shù)
OR AX , 1
next: loop start ;循環(huán)
基本思想: 我們可以回想階法的手算運(yùn)程:
1。試商:將被除數(shù)和除數(shù)左對齊,看看被除大于等于除數(shù)的幾倍,得到當(dāng)前商,因?yàn)槭鞘M(jìn)制數(shù),故當(dāng)前商為0-9.
2. 將被除數(shù)減去除數(shù)的當(dāng)前商?倍.
3. 被除數(shù)左移1位,轉(zhuǎn)第一步,繼續(xù)試商。
然后 看二進(jìn)制除法,和十進(jìn)制除法手算類類似,二進(jìn)制除法也需3步,不過更加簡單。
1. 試商,因?yàn)槭嵌M(jìn)制數(shù),故 當(dāng)前商 為0-1. 被除數(shù)大于除數(shù),當(dāng)前商 置1,小于除數(shù),當(dāng)前商 置0
2。被除數(shù) 減去 除數(shù)的 當(dāng)前商 倍。當(dāng)前商為1,被除數(shù)減去除數(shù)。否則,被除數(shù)不變。
3. 被除數(shù) 左移1位(二進(jìn)制的移位),繼續(xù) 第1步.
總結(jié)
以上是生活随笔為你收集整理的c语言无符号整型除法,用位运算的方法实现无符号整数的除法,游戏编程 | 李大仁博客...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《通信原理》多径衰落信道仿真1
- 下一篇: [数论 反演] BZOJ 4833 最小