题目:
怎么求二进制数中,第一次出现1的位置(高位)?
解题思路:
解法一、用O(n)的时间判断,每次用&操作判断最高位是否为1,如果不是则左移一位,直到找到第一个1为止。
解法二、用二分法。依次判断是否在左边或者右边。时间复杂度为O(lgn).
注:上面的n为二进制数的位数,下面代码中是从0开始计数的。
代码:
/**
* O(n)的解法
* @param a
* @return
*/
public int clz1(Byte a){
int n = 0;
while((a & 0x80) == 0){
a = (byte) (a << 1);
n++;
}
return n;
}
/**
* 用二分法
* @param a
* @return
*/
public int clz2(Byte a){
int n = 0;
if((0xF0 & a) == 0){
n += 4;
a = (byte) (a << 4);
}
if((0xC0 & a) == 0){
n += 2;
a = (byte) (a << 2);
}
if((0x80 & a) == 0){
n += 1;
}
return n;
}
当然可以用上面一样的方法求,除了上面的两种方法外,还有一个方法。
假设要求的数为a,那么令n=a-(a&(a-1)),然后lg(n)就是所求的结果。