是面试问题,所以寻找可能不明显的解决方案。
说有1111 ... 111100000 ... 000
的大流查找长度(数字)为1。
您可以假设此处1是设置位。
如果1是符号,它将如何改变,比如aaa..aaaabbbb ... bbbbb
我可以提出的一个解决方案是看第1位/符号,然后保持加倍间隔,然后看第3,然后看第7,依此类推。当你击中0或其他符号时,然后再次使用分而治之的方式向后移动到最后位置。
答案 0 :(得分:4)
如果您可以随机访问流并且已知流的长度,则可以使用O(log n)中的二进制搜索变体来执行此操作。
或者,你可以&使用0x1,如果为零,则递增计数器并右移1.或者,您可以检查整个字节(字,双字,四字等)是否为非零,以便更快地找到开始的块。无论哪种方式,那都是O(n)。
答案 1 :(得分:3)
如果要线性遍历位流,可以用32位块处理它,用0xFFFFFFFF(全1)执行按位AND并相应地更新计数。
这利用了这样一个事实,即现代CPU通常可以对32位字执行按位操作,作为单个原子操作。
如果AND的结果是0xFFFFFFFF,那么您知道可能有更多的位要遵循,因此必须检查下一个32位字。否则,您只需增加计数器并停止循环。
答案 2 :(得分:0)
二进制搜索找到索引s.t.第i位置位且第(i + 1)位不置位。 添加一个特殊情况,第一位未设置,最后一位被设置,你就完成了