将无符号整数舍入为两个幂

时间:2015-10-06 17:23:54

标签: c++ c rounding

我分配了大缓冲区,然后拆分成多个大小的块。这些大小从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语句的情况下将舍入数转换为数组中的索引。

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

2 个答案:

答案 0 :(得分:6)

您可以使用this bit triddling hack

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

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

答案 1 :(得分:1)

您可以使用一个函数来确定2的下一次幂而不进行循环。看到这个链接:

Next Power of 2