c – 将无符号整数舍入为2的幂次序

c – 将无符号整数舍入为2的幂次序,第1张

概述参见英文答案 > Rounding up to next power of 2                                    21个 我分配了大缓冲区,然后拆分成多个大小的块.这些尺寸从32开始,然后在每次增加时乘以2. struct Node{ Node* Next; void* Data; const u 参见英文答案 > Rounding up to next power of 2                                    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的幂次序所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1216920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存