用于寻找int的最高位的1
返回该位的权值
与此类似的题目还有寻找最低位1,数1的个数,
这类题目在微软,谷哥等公司的面试有可能考到
highestOneBit(int i)
{
i|=(i>>>1);
i|=(i>>>2);
i|=(i>>>4);
i|=(i>>>8);
i|=(i>>>16);
return i^(i>>>1);
}
执行完i|=(i>>>1)后,最高位1的右边也成为1
执行i|=(i>>>2)后,最高位1右边的1+2=3位以内都成为1
执行i|=(i>>>4)后,最高位1右边的1+2+4=7位以内都成为1
......
执行i|=(i>>>16)后,最高位1右边的1+2+4+8+16=31位以内都成为1
i^(i>>>1)即可将最高位1右边的1都置为0