//n<=15时的多项式除法,要求 被除数次数>=除数次数
#include <stdio.h>
typedef unsigned char U8;
typedef char S8;
typedef unsigned short U16;
S8 getHigh(U16 num)//获取最高位的次数
{
int i = 15;
for(; i>=0; i--)
{
if( (U16)(num>>i) )
return i;
}
return -1;
}
U16 div_2n(U16 dividend, U16 divisor)
{
U16 quotient = 0;
U8 divisor_h;
S8 diff;
divisor_h = getHigh(divisor);
diff = getHigh(dividend) - divisor_h;
while(diff>=0)//被除数次数 >= 除数次数
{
quotient |= (U16)(1<<diff);//商
if(diff)//存在余
dividend = ( dividend ^ (U16)(divisor<<diff) ) |
(U16)( (U16)(dividend<<(16-diff)) >> (16-diff));//余数,作为下一步的被除数
else
break;//退出
diff = getHigh(dividend) - divisor_h;
}
return quotient;
}
int main()
{
printf("%X\r\n", div_2n(0x35, 0xB));// 110101/1011
printf("%X\r\n", div_2n(0x3F, 0xB));// 111111/1011
return 0;
}
输出结果:
7
6
请按任意键继续. . .