C++ C++;

C++ C++;,c++,bit-manipulation,C++,Bit Manipulation,我正在寻找一种快速的方法来设置一种基于数字返回位掩码的方法。基本上,在数字输入之前需要发出4个1位。下面是我的一个好主意: foo(1);//返回0x000F foo(2);//返回0x00FF foo(3);//返回0x0FFF foo(4);//返回0xFFFF 我可以使用一个大的switch语句,但我不知道输入类型的宽度。(这是一个模板函数) 这是我尝试的第一件事: template <typename T> T foo(unsigned short length) {

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

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;
}
模板T foo(无符号短长度)
{
T结果=0xF;
对于(无符号短idx=length;idx>0;idx--)
{

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

e、 g.映射[1]=0x00F等


这将是最快的。

像这样的东西怎么样:

template <typename T> T foo(unsigned short length)
{
    return (T(1) << (length * 4)) - 1;
}
模板T foo(无符号短长度)
{

return(T(1)如果它只是文本,你甚至可以在编译时使用一个元函数来实现。劫持Charles的想法:

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;
模板
结构Foo{

enum{result=(T(1)如果您使用vector,它会不会更快,因为您可以使用v[1],v[2]等,这将是一个常量时间操作?抱歉--我不知道数组应该有多大,因为我不知道调用函数时类型的sizeof()。噢!甜甜的:)+1。太糟糕了,这是运行时;)在花了大约10分钟弄清楚它为什么会起作用后,这真是一个**!谢谢!@Charles Bailey,我花了超过10分钟的时间,因为我的模板编程已经相当生疏,我不得不承认这是一个非常好和优雅的解决方案。关键是要认识到T(1)将转换为类型的值1,然后移动该值,使其位于下一个半字节中,然后减去1以获得0xf。因此,无符号短路的示例为0x0001,然后移动为0x0010,然后减去1以获得0x000f。