0

我的问题是,在 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;
}
4

2 回答 2

1

有方法,但它们很丑,因为没有_BitScanForward或等效的内在。尽管如此,您实际上可以有效地计算这个东西,而不需要一个巨大的表。

第一步:创建一个数字,在您要搜索的位置为 1,其他位置为 0。

如果搜索 1,则表示x & -x。如果搜索 0,请使用~x & (x + 1).

然后,使用多种方法中的一种来模拟任一位扫描(现在只有一个设置位,因此从哪一侧搜索并不重要)。此处详细介绍了一些方法(不在 C# 中,但您可以转换它们)。

于 2013-06-13T07:44:53.667 回答
0

使用查找表。也就是说,预先计算一个以字节值和当前位置为索引的二维数组。您可以为 0 和 1 制作单独的表格,也可以将其组合起来。

因此,对于您的示例,您从数字 19 的第 0 位开始。那恰好是 1。因此,如果您查找nextBit[19][0]它应该返回1,依此类推。这是组合查找表的样子。它显示了 0 和 1 的下一位:

nextBit[19][0] = 1   // 1
nextBit[19][1] = 4   // 1
nextBit[19][2] = 3   // 0
nextBit[19][3] = 4   // 0
nextBit[19][4] = 0   // 1
nextBit[19][5] = 6   // 0
nextBit[19][6] = 7   // 0

显然,第 7 位没有“下一个”,如果“下一个”返回 0,则不再有该特定位。

我可能错误地解释了您的问题,但可以修改此技术以适合您的目的。我最初以为您想浏览所有 1 位或 0 位。相反,如果您想跳过连续的 1 位,那么您只需以这种方式排列您的表格。或者实际上,您可以在每个位置为 0 和 1 设置一个“下一个”。

于 2013-06-13T04:00:41.203 回答