位集中最长运行1的索引

时间:2014-12-11 10:48:25

标签: c language-agnostic bit-manipulation

是否有一种有效的算法(除了循环遍历所有位的简单实现之外)有效地找到32位或64位变量中最长1位运行的起始和结束索引?

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