将无符号整数四舍五入为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,以此类推。
和一个函数,接受一个数字,并返回指定数字可以四舍五入到的缓冲区大小。
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的次幂
相关文章:
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 计算机使用什么方法添加无符号整数
- boost::任何带有结构体和无符号整数
- 添加有符号和无符号整数
- 如何安全地比较两个无符号整数计数器?
- 计算 (64 位无符号整数) * (64 位无符号整数) 的商除以 2^64
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何将以"\0"开头的字符 * 转换为无符号整数?
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 如果我想将一个无符号整数四舍五入到最接近的更小或等于偶数的整数,我可以除以2然后乘以2吗
- 将无符号整数四舍五入为2的幂序列