我想写一个函数,返回最近的2个数的下一个幂.例如,如果我的输入是789,输出应该是1024.有没有任何方法可以实现这一点而不使用任何循环但只使用一些按位运算符?
如果我有一个整数n,我怎样才能找到的下一个号码k > n,使得k = 2^i,其中一些i的元件N由按位移动或逻辑.
示例:如果我有n = 123,我怎么能找到k = 128,哪个是2的幂,而不是124哪个只能被2整除.这应该很简单,但它让我望而却步.
我想编写一个内核模块,在那里我获得接近 8 mbps 的 TCP/IP 数据包。我必须将这些数据包存储 500 毫秒的持续时间。稍后这些数据包应按顺序转发。这些应该为 30 名成员完成。什么应该是最好的实施方法?我应该使用kmalloc一次(kmalloc(64000000, GFP_ATOMIC)吗?因为每次如果我这样做kmalloc,kfree都需要时间,从而导致性能问题。另外,如果我一次性在内核中分配内存,Linux 内核会允许我这样做吗?
我分配了大缓冲区,然后拆分成多个大小的块.这些尺寸从32开始,然后在每次增加时乘以2.
struct Node
{
Node* Next;
void* Data;
const unsigned Size;
};
Node* m_Buffers[16];
Run Code Online (Sandbox Code Playgroud)
这意味着缓冲区m_Buffers[0]的大小为32,缓冲区m_Buffers[1]的大小为64,依此类推.
并且一个函数接受一个数字并返回一个指定数字可以舍入到的大小的缓冲区.
void * GetBuffer(unsigned size)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我请求一个384的缓冲区,那么我需要能够在512处将其舍入并从中返回缓冲区m_Buffers[4].
到目前为止,我正在使用循环来舍入:
void * GetBuffer(unsigned size)
{
unsigned buffer_size = 32;
while (buffer_size < size)
{
buffer_size *= 2;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
但我很好奇是否有一种更好的方法可以不涉及循环.如果有一种方法可以将舍入数字转换为数组中的索引而不使用switch语句.
说实话,我甚至不确定标题是否正确.所以我为此道歉.
我正在寻找C#中最快的方法来将值舍入到最接近的2的幂.我发现如果使用像这样的按位运算符,最好的方法是将值舍入到下一个2的幂.
int ToNextNearest(int x)
{
if (x < 0) { return 0; }
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x + 1;
}
Run Code Online (Sandbox Code Playgroud)
但是这给了下一个最近的而不是最近的,我想只有最近的2的幂.这是一种简单的方法.
int ToNearest(int x)
{
Math.Pow(2, Math.Round(Math.Log(x) / Math.Log(2)));
}
Run Code Online (Sandbox Code Playgroud)
但是,是否有更好的优化版本找到最接近的两个值?
非常感谢.