当前位置 博文首页 > dadalaohua的博客:【位操作笔记】判断一个整数是否是2的次幂

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

    作者:[db:作者] 时间:2021-07-27 17:46

    判断一个整数是否是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.

    cs