【位操作笔记】判断一个整数是否是2的次幂

判断一个整数是否是2的次幂

2的次幂指的是2n,例如20,21,22,23,24,25,……

算法说明

通过x & (x - 1)来实现,这个公式会使x中位置最靠右并且值为1的bit位置0,例如0101 1010 =>0101 1000。

如果是x是2的次幂,那么就只会有一个bit位置1,那么这个公式就会将这个bit置0,所以结果就会是0。

例如:

20 = 0000 0001    20 - 1= 0000 0000

21 = 0000 0010    21 - 1= 0000 0001

22 = 0000 0100    22 - 1= 0000 0011

23 = 0000 1000    23 - 1= 0000 0111

24 = 0001 0000    24 - 1= 0000 1111

25 = 0010 0000    25 - 1= 0001 1111

……

实现代码

如果输入的值是2的次幂,则返回true,反之返回false。

bool integer_is_a_power_of_2(unsigned int val)
{
    return (val & (val - 1)) == 0;
}

上述的代码有个问题,如果输入的值为0,会错误地认为0是2的幂。
为了解决此问题,对代码做出以下优化:

bool integer_is_a_power_of_2_better(unsigned int val)
{
    return val && !(val & (val - 1));
}

算法计算过程

假设是26 = 0100 0000

        0100 0000
&       0011 1111
-----------------
        0000 0000

那么结果就会是0.

如果不是2的次幂,这里假设是0100 1010

        0100 1010
&       0100 1001
-----------------
        0100 1000

那么就结果就不为0,只会将最右侧值为1的bit清零。


[参考资料]

Bit Twiddling Hacks By Sean Eron Anderson

[Hacker’s Delight] 作者: Henry S. Warren Jr.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值