c – 返回2的幂的幂的最快算法是什么?

前端之家收集整理的这篇文章主要介绍了c – 返回2的幂的幂的最快算法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定n = 2 ^ k,我如何找到k假设n是32位整数,使用C/C++按位?

解决方法

好吧,您可以使用二进制指数显式存储在浮点数中的事实:
unsigned log2(unsigned x)
{
    float f = x;
    memcpy(&x,&f,sizeof x);
    return (x >> 23) - 127;
}

我不知道这有多快,它肯定不是最便携的解决方案,但我发现它非常有趣.

只是为了好玩,这是一个完全不同的,相对简单的解决方案:

unsigned log2(unsigned x)
{
    unsigned exp = 0;
    for (; ;)
    {
        switch (x)
        {
            case 128: ++exp;
            case 64: ++exp;
            case 32: ++exp;
            case 16: ++exp;
            case 8: ++exp;
            case 4: ++exp;
            case 2: ++exp;
            case 1: return exp;
            case 0: throw "illegal input detected";
        }
        x >>= 8;
        exp += 8;
    }
}

这是一个完全展开的解决方案:

#define CASE(exp) case (1 << (exp)) : return (exp);

unsigned log2(unsigned x)
{
    switch (x)
    {
        CASE(31) CASE(30) CASE(29) CASE(28)
        CASE(27) CASE(26) CASE(25) CASE(24)
        CASE(23) CASE(22) CASE(21) CASE(20)
        CASE(19) CASE(18) CASE(17) CASE(16)
        CASE(15) CASE(14) CASE(13) CASE(12)
        CASE(11) CASE(10) CASE( 9) CASE( 8)
        CASE( 7) CASE( 6) CASE( 5) CASE( 4)
        CASE( 3) CASE( 2) CASE( 1) CASE( 0)
        default: throw "illegal input";
    }
}
原文链接:https://www.f2er.com/c/116434.html

猜你在找的C&C++相关文章