使用位翻转的算法迭代所有具有k位的数字

时间:2016-11-30 15:42:03

标签: algorithm math gray-code

我正在寻找一种有效的方法来迭代所有n位非负整数,这些整数通过一次翻转一位来设置最多k位。

  

我需要做的最小位翻转次数是多少   迭代所有n位非负整数,最多设置k位?

我知道如果k = n,那么我们想迭代所有n位非负整数,那么我们就可以使用Gray code。这有一个伟大的属性,你只需要改变一位来获得一个新的数字。然而,如果k

2 个答案:

答案 0 :(得分:0)

迭代位0的所有值:从任何起始值开始,然后翻转位0.

迭代位0,1的所有值:从任何起始值开始。迭代位0的所有值。翻转位1.迭代位0的所有值。

迭代位0-2的所有值:从任何起始值开始。迭代位0,1的所有值。翻转位2.迭代位0,1的所有值。

迭代位0-3的所有值:从任何起始值开始。迭代0-2位的所有值。翻转位3.迭代位0-2的所有值。我希望现在系统清晰。

从i =任意值开始,j = 0。 将j增加1,确定在j中设置的最低位,在i中翻转该位。冲洗并重复。

答案 1 :(得分:0)

可以按如下方式实现已知的bit-fiddling技术(使用unsigned是底层的n位整数类型)

unsigned next_combination(unsigned x)
{
  unsigned u = x & -x;
  unsigned v = u + x;
  x = v  + (((v ^ x) / u) >> 2);
  return x;
}

它会生成&#34; next&#34;具有相同1位数的某些整数序列中的数字。 (1u << k) - 1u是起点。迭代在第一次溢出发生时结束。后者意味着该算法可以立即用于n小于unsigned中的位数。

(有关更详细的说明,请参阅https://en.wikipedia.org/wiki/Combinatorial_number_system。)