所以我有以下功能:
static int calcDTSize( int depth )
{
if ( depth <= 8 )
{
return 1;
}
if ( depth <= 16 )
{
return 2;
}
if ( depth <= 32 )
{
return 4;
}
if ( depth <= 64 )
{
return 8;
}
throw std::exception( "Invalid bit count" );
}
它计算指定位数所需的数据类型的大小。最初我刚才:
return ( (int) std::ceil( (double) depth / 8.0 ) );
但是,在我所知道的大多数机器上,没有一个3字节长的数据类型。
我确信在没有if语句的情况下必须采用更简洁的方式进行计算,但我无法思考如何。
任何人都有更好的解决方案吗?
答案 0 :(得分:3)
除以8并向上舍入到最接近2的幂。
考虑到输入是有限的并且信息是完全静态的,我可能会把它放在一个查找数组中并且
if (depth <= 64)
return lut[depth];
throw std::exception( "Invalid bit count" );
如果您不想要lut中的64个条目,您可以执行类似
的操作static int calcDTSize( int depth )
{
static int lut[] = { 0, 1, 2, 4, 4, 8, 8, 8, 8 };
if (depth <= 64)
return lut[(depth - 1 >> 3) + 1];
throw std::exception();
}
答案 1 :(得分:1)
return (int) std::pow(2.0, std::ceil((double)depth / 8.0) - 1)
因为它们都是2的幂,所以你只能找到具有除法的指数。
答案 2 :(得分:0)
您可以这样做:
static int calcDTSize( int depth )
{
const int d = depth / 8;
if (d < 1) || (d & (d - 1) != 0) || (d > 8)
throw std::exception("Invalid bit count");
return d;
}
其中:
const int d = depth / 8;
简单地给出整数除法的结果。
其中:
if (d < 1) || (d & (d - 1) != 0) || (d > 8)
检查d
是否在1到8之间,并且是2的幂。
诀窍是d & (d - 1)
表达式返回0
表示所有2的幂,否则返回非零值。
答案 3 :(得分:0)
此代码测试(1)值大于最大大小,(2)无效3字节数据大小和(3)值不是8的倍数:
static int calcDTSize( int depth)
{
if ( (depth <= 64) && (depth != 24) && (depth % 8 == 0) )
return depth / 8;
else
throw std::exception("Invalid bit count");
}