1.取最低,由於已知x&(x-1)是將最后一個1變成0(前篇已經解釋了),那么x-x&(x-1)即是最后一位1的數值。
2.取最高,先看代碼:
unsigned hight_bit(unsigned x)
{
//x=0010 1100 0000 0000 0000 0000 0000 0000 0000 0001 x= x|(x>>1); //0011 1110 0000 0000 0000 0000 0000 0000 0000 0000 x= x|(x>>2); //0011 1111 1000 0000 0000 0000 0000 0000 0000 0000 x= x|(x>>4); //0011 1111 1111 1000 0000 0000 0000 0000 0000 0000 x= x|(x>>8); //0011 1111 1111 1111 1111 1000 0000 0000 0000 0000 x= x|(x>>16); //0011 1111 1111 1111 1111 1111 1111 1111 1111 1111 x= x|(x>>32); //通常使用可以省略32 return (x+1) >> 1; //0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 = x+1 , 那么右移一次即可 }
將最高位的1向后擴散到比它低的所有位置,
再加一,就會得到高於最高位1個的數,所以右移一下就OK。