Previous power of 2

后端 未结 11 1455
一整个雨季
一整个雨季 2020-11-30 05:42

There is a lot of information on how to find the next power of 2 of a given value (see refs) but I cannot find any to get the previous power of two.

The only way I f

11条回答
  •  鱼传尺愫
    2020-11-30 06:41

    This can be done in one line.

    int nextLowerPowerOf2 = i <= 0
                            ? 0
                            : ((i & (~i + 1)) == i)
                                ? i >> 1
                                : (1 << (int)Math.Log(i, 2));
    

    result

    i    power_of_2
    -2    0
    -1    0
    0    0
    1    0
    2    1
    3    2
    4    2
    5    4
    6    4
    7    4
    8    4
    9    8
    

    Here's a more readable version in c#, with the <=0 guard clause distributed to the utility methods.

    int nextLowerPowerOf2 = IsPowerOfTwo(i) 
        ? i >> 1 // shift it right
        : GetPowerOfTwoLessThanOrEqualTo(i);
    
    public static int GetPowerOfTwoLessThanOrEqualTo(int x)
    {
        return (x <= 0 ? 0 : (1 << (int)Math.Log(x, 2)));
    }
    
    public static bool IsPowerOfTwo(int x)
    {
        return (((x & (~x + 1)) == x) && (x > 0));
    }
    

提交回复
热议问题