找到比某个数大的最小的2的次幂
原创
©著作权归作者所有:来自51CTO博客作者wx63993a9e4baf6的原创作品,请联系作者获取转载授权,否则将追究法律责任
如何判断是一个数是否是2的次幂
请参看笔者的这篇博客 判断一个数是否是2的幂_papaya的博客-
问题
找到比某个数大的最小的2的次幂,比如比255大的最小的2的次幂数就是256,比60大的最小的2的次幂数就是64
原理
如果一个数是2的幂,那么其二进制格式一定为001000,000100这种模型
即从有效位开始算,最高位只有一个1,左侧全部为0。
有一个规律是,这种2的次幂数和比它小的数进行与运算时,结果一定为0
所以,我们从最高位往右侧,逐个位判断,符合这种格式的就是最小的2的幂
代码如下
uint32_t UnlockQueue::roundup_power_of_2(uint32_t val)
{
// 已经是2的幂了,可直接返回
if ((val & (val-1)) == 0)
{
return val;
}
// uint32类型中,2的次幂最大数
uint32_t andv = 0x80000000;
// 逐位右移,直到找到满足val第一个位为1的
while ((andv & val) == 0)
{
andv = andv>>1;
}
// 再左移一位,确保比val大
return andv<<1;
}