是否有一种有效的算法(除了循环遍历所有位的简单实现之外)有效地找到32位或64位变量中最长1位运行的起始和结束索引?
答案 0 :(得分:2)
可以重复计算x & (x << 1)
,直到结果为0.迭代次数是设置的最高位数。
从那里,要获得开始和结束索引,查看上一次到最后一次迭代,给出起始索引,添加计数给出结束索引。
引用this answer:
以下是基于如下概念:
AND
有点序列 随着自身的转移版本,你有效地删除了 从一行连续的1行中尾随1。11101111 (x) & 11011110 (x << 1) ---------- 11001110 (x & (x << 1)) ^ ^ | | trailing 1 removed
重复此
N
次将减少任何连续N
的序列 1到0x00
。
结合所有这些,例如11101111
:
11101111 start sequence
& 11011110
----------
11001110
& 10011100
----------
10001100
& 00011000
----------
00001000 previous to last iteration, only 1 bit set, so start index = 5
& 00000000
----------
00000000 end, 4 iterations, so longest bit set count = 4
=> start index = 5, end index = 5 + 4 = 9
如果存在多个竞争运行,则在前一次迭代中将存在多个设置位,例如, 111101111
:
111101111
& 111011110
-----------
111001110
& 110011100
-----------
110001100
& 100011000
-----------
100001000 previous to last iteration, start index can be 1 or 6
& 000000000
-----------
000000000 end, 4 iterations, so longest bit set count = 4
=> start index = 1 or 6, end index = 1 + 4 = 5 or 6 + 4 = 10