【发布时间】:2013-06-09 08:20:07
【问题描述】:
我的问题是,在 C# 中是否有一种方法可以通过起始位位置找到指定值为 0 或 1 的字节内的下一个二进制数字,而无需迭代(寻找最高的性能 选项)。
例如,如果您有 10011 并从第一位(最右边)开始并搜索第一个 0,那么它将是从右到左的第三位。如果您随后从第 3 位开始并想找到下一个 1,它将位于第 5 位(最左侧)。
感谢您的帮助,如果我需要进一步提供任何信息,请随时告诉我。
编辑:这是我当前的代码。
private int GetBinarySegment(uint uiValue, int iStart, int iMaxBits, byte bValue)
{
int r = 0; uiValue >>= iStart;
if (uiValue == 0) return iMaxBits - iStart;
while ((uiValue & 1) == bValue) { uiValue >>= 1; r++; }
return r;
}
【问题讨论】:
-
@STLDeveloper 只有各种形式的迭代。我开始只是移位,直到最右边的位发生变化,然后记录移位次数,直到位位置 0 发生变化。如果我需要指定一个“起始”位置,我会在运行循环之前移动该数量。由于它都是二进制的,我希望有一个更优雅的选择。
-
你对结果做了什么?有可能直接使用指示该位的掩码完成的事情,还是真的必须是索引?
-
@harold 我想我应该更愿意提供信息来获取信息。我正在研究一种进行多维洪水填充的方法,以识别游戏标量场/体素地形环境中的所有实体对象。我相信通过一些类似的技巧,我可以获得比典型的迭代方法洪水填充更好的结果。
-
我将把我的 3D 地形数据存储在页面/块中,每个 Y 坐标都有一个字节值(X/Z 是水平的)。如果我能以“游程编码”的方式遍历字节值,从我的角度来看,这听起来像是一种巧妙的方法。
-
好吧,你可以跳过“起始位置”-shift,方法是使用掩码设置/取消设置你找到的位。此外,对于按位技巧,使用更宽的词几乎总是更好,因为它减少了开销。我还不确定你在做什么
标签: c# binary bit-manipulation bit-shift