此处求大于等于前整数x的最小的2的n次方,此处的代码短小精悍,十分高效,后文也附上了原理的解析,个人理解欢迎探讨,批评指正。
一、代码int getCeilPowerOfTwo(int num)
{
--num;
num |= num >> 1;
num |= num >> 2;
num |= num >> 4;
num |= num >> 8;
num |= num >> 16;
return ++num;
}
二、示例及原理分析
- x = 160;
x = 1010 0000(二进制) - x |= x >> 1;
x = (x | x >> 1);
x = ( 1010 0000 | 0101 0000) = 1111 0000; - x |= x >> 2;
x = (x | x >> 2) = ( 1111 0000 | 0011 1100);
= 1111 1100 - x |= x >> 4;
x = (x | x >> 4);
x = ( 1111 1100 | 0011 1111) = 1111 1111 - x |= x >> 8;
x = (x | x >> 8);
x = ( 1111 1111 | 0000 0000)
= 1111 1111 - x |= x >> 16;
x = (x | x >> 16);
x = ( 1111 1111 | 0000 0000)
= 1111 1111
算下来发现 我们拿到一个数160,对应的二进制数为1010 0000,通过计算我们知道大于它的最小的2的n次方就是256,就是2的8次方也就是1 0000 0000,可以看出2的8次方,就是数值1010 0000本身1的最高位的位数再左移1,或者就是巧妙的运用 了右移(速度快),和按位或运算(保证高位的1不会丢失,保证低位都是1)同样得到了2的8次方:1111 1111+1 = 1 0000 0000;
【注意】对于刚好是2的n次方的数字;
eg. x = 256 =1 0000 0000; 本身就是结果,按照上面的方式运算结果为1 1111 1111,再+1就大了,考虑到这种情况,所以最开始就要-1,大家也不妨自己拿一个小例子自己试试看哦~
如果觉得我的内容对你有帮助,请点赞支持以下哦,感谢~



