位运算之取二进制数字的最高/低位的1的数值


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。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM