C ++中的快速按位问题

时间:2009-07-20 05:05:40

标签: c++ bit-manipulation

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

FOO(1); //返回0x000F FOO(2); //返回0x00FF FOO(3); //返回0x0FFF FOO(4); //返回0xFFFF

我可以使用一个大的switch语句,但我不知道输入类型有多宽。 (这是模板功能)

这是我尝试的第一件事:

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循环上做维护。我没有想过这样做的任何聪明方法吗?

Billy3

3 个答案:

答案 0 :(得分:9)

如下:

template <typename T> T foo(unsigned short length)
{
    return (T(1) << (length * 4)) - 1;
}

答案 1 :(得分:6)

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

e.g。 map [1] = 0x00F等。

这将是最快的。

答案 2 :(得分:2)

如果它只是文字,你甚至可以在编译时通过使用元函数来完成。劫持查尔斯的想法:

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;