//高精度整数开根号算法
//假设被开方数为y(16位),而开方结果为x(8位),并且表示为一下格式:(32位开方类似)
//y = a15*2^15 + a14*2^14 +...+ a1*2^1 + a0*2^0;
//x = b7*2^7 + b6*2^6 + ... + b1*2^1 + b0^0;
unsigned int sqrt_int(unsigned int y)
{
unsigned int x,i,cmp,m,n,r,tmp;
x=0; //初始化根为0
r=y; //初始化余数为被开方数
m=r>>14; //初始化m = a31*2 + a30;
n=14; //初始化 n = 16 - 2*n;
if (m>=1) //确定根的最高位
{
x=1;
r=y-(x<<n);
}
for (i=0;i<7;i++)
{
n-=2; //32 - 2*n (n=2,3,4...)
x=x<<1;
cmp=((x<<1)+1)<<n; //递推公式
if(r>=cmp) //确定根在此位上为0还是1
{
x++; //根在此位上为1
r=r-cmp; //更新余数
}
}
return x;
}