二进制跳跃段

时间:2013-06-13 03:30:26

标签: c# binary bit-manipulation bit-shift

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

2 个答案:

答案 0 :(得分:1)

有一些方法,但它们很难看,因为没有_BitScanForward或等效的内在。不过,你实际上可以有效地计算这个东西,而不需要一张大桌子。

第一步:在你正在搜索的位置创建一个数字,在其他地方创建一个数字。

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

然后,使用多种方法中的一种来模拟bitscan(现在只有一个设置位,所以搜索哪一侧并不重要)。一些方法是详细的here(不是在C#中,但你可以转换它们。)

答案 1 :(得分:0)

使用查找表。也就是说,预先计算由字节值和当前位置索引的2D数组。你可以为零和一个单独的表做,或者你可以把它组合起来。

因此,对于您的示例,您从数字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位没有'next',如果'next'返回0,则不再有那个特定的位。

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