I believe that those who know the purpose of division also know how to calculate division. However, the method of calculating division in computers may waste some resources. The following is the process of converting division using bitwise calculations. I believe that friends who know game programming should be familiar with this.
Principle: If A/B needs to be implemented, if B is a power of 2, then it is straightforward to perform bitwise shift operations. If B is 0, don't ask me what A/0 equals, because I don't know either.
Code:
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 is an important number, suitable for 32-bit machine operations
float f = 2 ^ r / B;
float t = f - ( int ) f; //Get the decimal part
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);
}
Explanation:
First, obtain the highest bit of B, which is max(log2^B).
Then, add 32 to this b. 32 is an important number, suitable for 32-bit machine operations.
Assume r = 32 + b.
Calculate f = 2^r / B.
Get the decimal part t of f.
If t < 0.5, the result is (((A+1) * f) >> r)-(A>>count).
If t > 0.5, the result is ((A*f) >> r)-(A>>count).
If t = 0.5, error.
Attachment: Assembly source code for machine implementation of integer division, from CSDN
mov cx,16 ;The result is 16 bits, loop 16 times
start:
SHL AX , 1 ;Shift the dividend left by 1 bit
RCL DX , 1
CMP DX , BX ;Try to divide
JB next ;The current quotient is 0, do not process
SUB DX , BX ;Subtract the divisor
OR AX , 1
next: loop start ;Loop
Basic idea: We can recall the manual calculation process of division by stages:
- Try to divide: Align the dividend and divisor, and see how many times the dividend is greater than or equal to the divisor, obtaining the current quotient. Since it is a decimal number, the current quotient is 0-9.
- Subtract the current quotient times the divisor from the dividend.
- Shift the dividend left by 1 bit, go to the first step, and continue to try to divide.
Then, let's look at binary division, which is similar to manual decimal division. Binary division also requires 3 steps, but it is simpler.
- Try to divide: Since it is a binary number, the current quotient is 0-1. If the dividend is greater than the divisor, set the current quotient to 1; otherwise, set it to 0.
- Subtract the current quotient times the divisor from the dividend. If the current quotient is 1, subtract the divisor; otherwise, the dividend remains unchanged.
- Shift the dividend left by 1 bit (binary shift), go to the first step.