C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 将无符号整数舍入为2的幂次序大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Rounding up to next power of 2@R_616_5179@@R_616_5179@@R_616_5179@@R_616_5179@@R_616_5179@ 21个
我分配了大缓冲区,然后拆分成多个大小的块.这些尺寸从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语句.

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

解决方法

您可以使用 this bit triddling hack

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

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

大佬总结

以上是大佬教程为你收集整理的c – 将无符号整数舍入为2的幂次序全部内容,希望文章能够帮你解决c – 将无符号整数舍入为2的幂次序所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。