位数的数据类型大小

时间:2011-05-23 13:01:31

标签: c++

所以我有以下功能:

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语句的情况下必须采用更简洁的方式进行计算,但我无法思考如何。

任何人都有更好的解决方案吗?

4 个答案:

答案 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");
}