您的位置:首页 > 其它

整数快速开平方算法

2010-11-09 08:35 232 查看
//平方根square root
unsigned int __stdcall i32_sqrt(unsigned long x)
{ unsigned int r, i; // 结果、循环计数
unsigned long t, k; // 临时变量
if (x == 0 || x== 1) // 被开方数,0,1开方结果为自身
return x;

r = 0;

t = (x >> 30); // 获取最高位
x <<= 2;
if (t > 1) // 最高位为1
{
r ++; // 结果当前位为1,否则为默认的0
t -= r;
}

for (i=15; i>0; i--) // 求剩余的15位
{
r <<= 1; // 左移一位

t <<= 2;
t += (x >> 30); // 假设

k = r;
k = (k<<1)+1;

x <<= 2;
if (t >= k) // 假设成立
{
t -= k;
r ++;
}

}

return r;
};
//平方根square root
unsigned long __stdcall i64_sqrt(unsigned __int64 x)
{ unsigned int i; //循环计数
unsigned long r; // 结果
unsigned __int64 t, k; //临时变量
if (x == 0 || x== 1) // 被开方数,0,1开方结果为自身
return (unsigned long)x;

r = 0;

t = (x >> 62); // 获取最高位
x <<= 2;
if (t > 1) // 最高位为1
{
r ++; // 结果当前位为1,否则为默认的0
t -= r;
}

for (i=31; i>0; i--) // 求剩余的31位
{
r <<= 1; // 左移一位

t <<= 2;
t += (x >> 62); // 假设

k = r;
k = (k<<1)+1;

x <<= 2;
if (t >= k) // 假设成立
{
t -= k;
r ++;
}

}

return r;
};

//
// 计算32位整数的平方根
//
int __stdcall u32_sqrt(int val)
{
int r = 0;
for(int shift=0;shift<32;shift+=2)
{ int x=0x40000000l >> shift;

if(x + r <= val)
{ val -= x + r;
r = (r >> 1) | x;
} else
{ r = r >> 1;
}
}
//if(r < val) ++r;

return r;
};

__int64 __stdcall u64_sqrt(__int64 val)
{
__int64 r = 0;
for(int shift=0;shift<64;shift+=2)
{ __int64 x=0x4000000000000000l >> shift;

if(x + r <= val)
{ val -= x + r;
r = (r >> 1) | x;
} else
{ r >>= 1;
}
}

//if(r < val) ++r;

return r;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: