我正在寻找一种快速的方法来设置一个基于数字返回位掩码的方法。基本上,在数字输入之前需要发出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
答案 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;