【问题标题】:Round unsigned integer to a sequence of powers of two [duplicate]将无符号整数四舍五入为二的幂序列
【发布时间】:2016-01-03 17:18:54
【问题描述】:

我分配了大缓冲区,然后分成多个大小的块。这些大小从 32 开始,然后每次增加乘以 2。

struct Node
{
    Node*           Next;
    void*           Data;
    const unsigned  Size;
};

Node* m_Buffers[16];

这意味着m_Buffers[0] 的缓冲区大小为 32,m_Buffers[1] 的缓冲区大小为 64,依此类推。

还有一个函数,它接受一个数字并返回一个指定数字可以向上取整的大小的缓冲区。

void * GetBuffer(unsigned size)
{
    // ...
}

例如,如果我请求一个 384 的缓冲区,那么我需要能够在 512 处四舍五入,并从 m_Buffers[4] 返回一个缓冲区。

到目前为止,我正在使用循环来四舍五入:

void * GetBuffer(unsigned size)
{
    unsigned buffer_size = 32;

    while (buffer_size < size)
    {
        buffer_size *= 2;
    }

    // ...
}

但我很好奇是否有更好的不涉及循环的舍入方法。如果有一种方法可以在不使用 switch 语句的情况下将四舍五入的数字转换为数组中的索引。

老实说,我什至不确定标题是否正确。所以我为此道歉。

【问题讨论】:

    标签: c++ c rounding


    【解决方案1】:

    您可以使用函数来确定 2 的下一个幂,而无需循环。请参阅此链接:

    Next Power of 2

    【讨论】:

      【解决方案2】:

      您可以为此使用this bit triddling hack

      unsigned int v;
      v--;
      v |= v >> 1;
      v |= v >> 2;
      v |= v >> 4;
      v |= v >> 8;
      v |= v >> 16;
      v++;
      

      这个想法是将v-1 的最高有效位(MSB)“粘贴”到低于MSB 本身的所有位置,这会产生2k-1 形式的数字。之后,数字会递增以得出最终结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 2015-01-26
        • 2014-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多