如何判断是一个数是否是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;
}