将无符号整数四舍五入为2的幂序列

Round unsigned integer to a sequence of powers of two

本文关键字:无符号整数 四舍五入      更新时间:2023-10-16

我分配了很大的缓冲区,然后分成不同大小的块。这些尺寸从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语句,也可以将四舍五入的数字转换为数组中的索引。

老实说,我甚至不确定标题是否正确。我很抱歉

你可以使用这个小技巧:

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的数字。在此之后,该数字被递增以得到最终结果。

您可以使用函数来确定2的下一个幂,而不需要循环。请看这个链接:

2的次幂