题1. 给定一个无符号整型数据(unsigned int),找出其对应二进制数据中bit位为1的最高/低索引。
比如:对于数据0,返回0;数据1,返回1;数据0x80000000,返回32;
题2. 给定一个无符号64bit整型数据(unsigned long long int),找出其对应二进制数据中bit位为1的最高/低索引。
比如:对于数据0,返回0;数据1,返回1;数据0x4000000000000000,返回63;
题3. 给定一个无符号长整型数据(unsigned long int),找出其对应二进制数据中bit位为1的最高/低索引。
>对于题1:
/*
方法一:二分法
*/
int fls(unsigned int x)
{
int r=;
if(!x)
return ;
if(!(x&0xffff0000u)){
x<<=;
r-=;
}
if(!(x&0xff000000u)){
x<<=;
r-=;
}
if(!(x&0xf0000000UL)){
x<<=;
r-=;
}
if(!(x&0xc0000000UL)){
x<<=;
r-=;
}
if(!(x&0x80000000UL)){
x<<=;
r-=;
}
return r;
}
/*
方法二:遍历法
*/
int fls(unsigned int x)
{
int i,pos=0;
for(i=1;i<=32;++i){
if(x&0x1)
pos=i;
x>>=1;
}
return pos;
}
>对于题2:
unsigned long long int为64bit数据,借助题1实现
int fls_64(unsigned long long int x)
{
unsigned int _x= x>>;
if(_x)
return fls(_x)+;
return fls(x);
}
>对于题3:
由于unsigned long int类型的size会根据编译器的不同而不同,所以应该考虑无符号长整型为8byte和4byte的情况。总和题1/2
int fls_long(unsigned long int x)
{
if (sizeof(x) == 4)
return fls(x);
return fls_64(x);
}
欢迎大家批评指正 |;-)