c# - 如何有效地包装固定大小的循环缓冲区的索引

标签 c# java c++ optimization circular-buffer

我有一个固定大小的循环缓冲区(作为数组实现):初始化时,缓冲区会填充指定的最大数量的元素,这允许使用单个位置索引来跟踪我们当前的位置圆圈。

访问循环缓冲区中元素的有效方法是什么?这是我目前的解决方案:

int GetElement(int index)
{
    if (index >= buffer_size || index < 0)
    {
        // some code to handle the case
    }
    else
    {
        // wrap the index
        index = end_index + index >= buffer_size ? (index + end_index) - buffer_size : end_index + index;
    }

    return buffer[index];
}

一些定义:
end_index 是紧跟在圆圈中最后一个元素之后的元素的索引(它也被认为与 start_index 相同,即圆圈的第一个元素)。
buffer_size 是缓冲区的最大大小。

最佳答案

我想到的最好的是:

public static int Wrap(int index, int n)
{
    return ((index % n) + n) % n;
}

(假设您需要使用负数)

关于c# - 如何有效地包装固定大小的循环缓冲区的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4868049/

相关文章:

c++ - 如何将变量分配给 ASCII 文件中的项目并在 C++ 中计算它们?

c# - Azure Function - "PartitionKey extracted from document doesn' t 与在门户中创建的容器上的 header 中指定的匹配

c# - 在不设置断点的情况下调试 Visual Studio 2010 中的所有事件

java - 有没有一种干净简单的方法可以使 Java OS 中的文件路径字符串不可知?

java - 如何在 Java Web 应用程序中设置语言环境?

java - 如何编写一个 equals 方法来比较一个团队与另一个团队?

C++我期待缩小转换错误但没有得到它

c++ - 使用派生类的模板参数的抽象基类

c# - ADO.NET 适当的数据插入

c# - 从 Azure DevOps 发布管道部署时,从 Visual Studio 发布的 ASP.NET Core 3.1 Web 应用程序不起作用