整数快速开平方算法
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;
};
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;
};
相关文章推荐
- 整数快速开平方算法
- 算法的强大——快速计算一个正二进制整数中包含多少个1
- [置顶] RSA 平方-乘算法 与 快速幂
- 完全平方数的判定及整数平方根的快速求解
- 快速开平方的算法
- 算法爱好者——判断某整数是否为两数平方之和 ? 待解决
- 快速幂算法和大整数求模
- 从大整数乘法的实现到 Karatsuba 快速算法
- 平方根的快速算法
- 快速求平方根的算法
- 快速求平方根的算法
- 算法的强大——快速计算一个正二进制整数中包含多少个1
- [转贴]《雷神之锤III》里求平方根倒数的函数(快速平方根(倒数)算法)
- 完全平方数的判定及整数平方根的快速求解
- 关于卡马克算法和系统函数库方法快速开平方根快慢的研究
- 超长整数的基础运算 算法实现自平方篇
- 算法 - 快速求一个整数的7倍
- * 期末考试 编程题#4:计算整数平方和(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 求log2(n)的整数部分的快速算法
- [转贴]《雷神之锤III》里求平方根倒数的函数(快速平方根(倒数)算法)