用牛顿迭代法整数(只求整数)的平方根

用牛顿迭代法求一个整数(只求整数)的平方根!
请高手指点一下!重写一个sqrt()--求一个32位的整数的平方根的算法,开根号后是一个16位的int 型~!!请高手帮个忙哈!分数会给大家的!
------解决方案--------------------
主要思想:设要求的这个数为a,它的平方根为x;然后我们一开始令x=a;然后我们进入一个循环,不断的令x=(x+a/x)/2,就是令x等于 x和a/x的平均值,这样迭代了7-10次左右就可以得到a的平方根x的近似值。

假如我们求10的平方根,那么a=10,x=10;

( 10     +   10/10   ) / 2 = 5.5
( 5.5     +   10/5.5 ) / 2 = 3.659090909….
( 3.659090909 + 10/3.659090909)/2=3.1960050818631…..
……


写成code的话就是这样:

double my_sqrt(double a){
      double x;
      x=a;
      for(int i=1;i<=10;i++)    //要求精度高的话,可以设置次数多些,比如100
            x=(x+a/x)/2;
      return x;
}

这样就得到了一个浮点数a的平方根,当然了,平方根也是浮点型的。
如果只要求整形的话,可以运算后,转换成整形,比如: int result = (int)my_sqrt( (int)12.34 );
------解决方案--------------------
这里有个无符号整型,移位开平方的方法,不是牛顿法,可以不?
模拟手动开放的实现

/** 移位开方法 **/
/**  两个无符号整型数据一起左移              **/
#define  shl_2_n(x,y,n)  do{(x) <<= (n);(x)+= ((y) >>(sizeof(y)*8-(n)));(y) <<= (n); }while(0);

unsigned sqrt_ir(unsigned n,unsigned *re)
{
   unsigned remain =0;
   unsigned r =0;
   unsigned k = sizeof(n)*8 / 2 ;

   do {
        r <<= 1;
        shl_2_n(remain,n,2);
        if(remain >= r*2 + 1 ) {
            remain -= r * 2 + 1;
            r ++;
        }
   }while(--k> 0);
   *re = remain;
   return r;
}