代码之家  ›  专栏  ›  技术社区  ›  Billy ONeal IS4

C++中的快速Bitwise Question

  •  0
  • Billy ONeal IS4  · 技术社区  · 16 年前

    我正在寻找一种快速的方法来设置一种基于数字返回位掩码的方法。基本上,需要发出4个1位的预数字输入。我的意思是:

    foo(1);//返回0x000f foo(2);//返回0x00FF foo(3);//返回0x0fff foo(4);//返回0xffff

    我可以使用一个大开关语句,但我不知道输入类型提前有多宽。(这是一个模板函数)

    我尝试的第一件事是:

    template <typename T> T foo(unsigned short length)
    {
        T result = 0xF;
        for (unsigned short idx = length; idx > 0; idx--)
        {
            result = (result << 4 | 0xF);
        }
        return result;
    }
    

    但它在for循环上花费了大量时间进行维护。有什么我没想到的聪明的方法吗?

    比利3

    3 回复  |  直到 16 年前
        1
  •  9
  •   CB Bailey    16 年前

    比如:

    template <typename T> T foo(unsigned short length)
    {
        return (T(1) << (length * 4)) - 1;
    }
    
        2
  •  6
  •   Larry Watanabe    16 年前

    只需创建一个数组,将每个数字映射到适当的位掩码。

    例如,map[1]=0x00f等。

    这将是最快的。

        3
  •  2
  •   sbi    16 年前

    如果只是文本,甚至可以在编译时使用元函数来完成这项工作。劫持查尔斯的想法:

    template <typename T, unsigned short L> 
    struct Foo {
        enum { result = (T(1) << (L * 4)) - 1 };
    };
    
    std::cout << std::setw(4) << std::setfill('0') << std::hex << Foo<int,3>::result;