将无符号整数舍入为 2 的幂序列
Round unsigned integer to a sequence of powers of two
我分配了大缓冲区,然后分成多个大小的块。这些尺寸从 32 开始,然后每次增加都乘以 2。
struct Node
{
Node* Next;
void* Data;
const unsigned Size;
};
Node* m_Buffers[16];
这意味着 m_Buffers[0]
的缓冲区大小为 32,m_Buffers[1]
的缓冲区大小为 64,依此类推。
还有一个函数,它接受一个数字和 return 一个大小为指定数字可以四舍五入的缓冲区。
void * GetBuffer(unsigned size)
{
// ...
}
例如,如果我请求一个 384 的缓冲区,那么我需要能够将其舍入到 512 和 return 来自 m_Buffers[4]
.
的缓冲区
到目前为止,我正在使用循环进行汇总:
void * GetBuffer(unsigned size)
{
unsigned buffer_size = 32;
while (buffer_size < size)
{
buffer_size *= 2;
}
// ...
}
但我很好奇是否有更好的不涉及循环的舍入方法。还有如果有一种方法可以在不使用 switch 语句的情况下将四舍五入的数字转换为数组中的索引。
老实说,我什至不确定标题是否正确。所以我为此道歉。
你可以使用 this bit triddling hack:
unsigned int v;
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
想法是 "paste" v-1
的最高有效位 (MSB) 在所有低于 MSB 本身的位置,它产生一个 2k 形式的数字-1。之后数字递增得到最终结果。
您可以使用一个函数来确定下一个 2 的幂而无需循环。看到这个 link:
Next Power of 2
我分配了大缓冲区,然后分成多个大小的块。这些尺寸从 32 开始,然后每次增加都乘以 2。
struct Node
{
Node* Next;
void* Data;
const unsigned Size;
};
Node* m_Buffers[16];
这意味着 m_Buffers[0]
的缓冲区大小为 32,m_Buffers[1]
的缓冲区大小为 64,依此类推。
还有一个函数,它接受一个数字和 return 一个大小为指定数字可以四舍五入的缓冲区。
void * GetBuffer(unsigned size)
{
// ...
}
例如,如果我请求一个 384 的缓冲区,那么我需要能够将其舍入到 512 和 return 来自 m_Buffers[4]
.
到目前为止,我正在使用循环进行汇总:
void * GetBuffer(unsigned size)
{
unsigned buffer_size = 32;
while (buffer_size < size)
{
buffer_size *= 2;
}
// ...
}
但我很好奇是否有更好的不涉及循环的舍入方法。还有如果有一种方法可以在不使用 switch 语句的情况下将四舍五入的数字转换为数组中的索引。
老实说,我什至不确定标题是否正确。所以我为此道歉。
你可以使用 this bit triddling hack:
unsigned int v;
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
想法是 "paste" v-1
的最高有效位 (MSB) 在所有低于 MSB 本身的位置,它产生一个 2k 形式的数字-1。之后数字递增得到最终结果。
您可以使用一个函数来确定下一个 2 的幂而无需循环。看到这个 link:
Next Power of 2