64,642
社区成员
发帖
与我相关
我的任务
分享
shl_2_n(remain,n,2)
是把remain,和n, 当作一个双倍精度整数移位,应该是是算术左移吧.
相当于
typedef unsigned long long uint64 ;
uint64 a = (uint64)remain<<32 + n;
a <<= 2;
remain = a >>32;
n =a;
不过,不用考虑平台问题,当 uint64替换unsinged 结果同样可用
主要考虑数据类型的独立性 ,不会因为,两种不同无符号整数类型的,不可移植性,造成程序不可移植性
作用不大 /** 移位开方法 **/
/** 两个无符号整型数据一起左移 **/
#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;
}