取二进制(非符号位)的最高位1

将最高位的1向后扩散到比它低的所有位置
再加一,就会得到高于最高位1个的数,所以右移一下就OK。

unsigned hight_bit(unsigned 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);
	// 如果数特别大, 这里感觉会溢出, 所以这里只使用于小于数据最大值1/2的数。
	return (x+1) >> 1;        //0100 0000 0000 0000 0000 0000 0000 0000 0000 0000
}

你可能感兴趣的:(算法进阶NOW,取二进制最高位)