2009-07-20 34 views
0

我正在尋找一種快速方法來設置基於數字返回位掩碼的方法。基本上,需要在預編號輸入時發出4個比特。這裏有一個好主意,我的意思是:在C++中快速按位查詢問題

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; 
} 

,但它花費了大量的時間在做maintenence for循環。任何聰明的做法我沒有想到?

Billy3

回答

9

如何像:

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

只需創建每個數字到適當的位掩碼映射的陣列。

例如map [1] = 0x00F等。

這將是最快的。

+0

打倒我一秒鐘。 – GManNickG 2009-07-20 05:10:14

+0

相反,如果你使用矢量不會更快,因爲你可以使用v [1],v [2]等等,這將是一個恆定的時間操作? – Naveen 2009-07-20 05:39:54

+0

對不起 - 我不知道數組應該有多大,因爲我不知道sizeof()函數被調用時的類型。 – 2009-07-20 05:48:37

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;