加一点注释:
unsigned short work( unsigned int n/*要进行开平方运算的对象*/ )
{
unsigned int ans = 0;/*开平方运算的结果*/
unsigned int square = 0;/*记录中间产生的平方值*/
unsigned short r = 0;/*程序最终的返回结果*/
for ( int i = 15; i >= 0; --i )/*整形的长度为4个字节,即32位,这里取15为30的一半,够用了*/
{
unsigned int tmp = square;/*上次运算的平方值*/
tmp += (ans<<(i+1))+(1<<(i<<1));
/*tmp-ans的平方,(ans<<(i+1))-即2*(ans<<i)=2 * ans * (1 <<i),(1<<(i<<1))-即(1 <<i)的平方,
即整个式子含义是(ans+(1 <<i))的平方赋给tmp*/
if ( tmp <= n )/*生成的平方值如果大于被开方的数n,显然应该被舍弃*/
{
square = tmp;/*记录本次循环的平方值*/
ans |= 1<<i;/*生成开平方结果*/
}
}
r |= ans;/*留下需要的位,返回开平方结果*/
return r;
}
这样写的算法核心思想是做二进制的处理,即选择每一位上是1还是0,实际上是一种搜索算法。