找出二进制数中bit为1的最(高/低)索引
题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=32; if(!x) return 0; if(!(x&0xffff0000u)){ x<<=16; r-=16; } if(!(x&0xff000000u)){ x<<=8; r-=8; } if(!(x&0xf0000000UL)){ x<<=4; r-=4; } if(!(x&0xc0000000UL)){ x<<=2; r-=2; } if(!(x&0x80000000UL)){ x<<=1; r-=1; } 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>>32; if(_x) return fls(_x)+32; 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); }
欢迎大家批评指正 |;-)

浙公网安备 33010602011771号