我正在寻找一种有效的方法来迭代所有n位非负整数,这些整数通过一次翻转一位来设置最多k位。
我需要做的最小位翻转次数是多少 迭代所有n位非负整数,最多设置k位?
我知道如果k = n,那么我们想迭代所有n位非负整数,那么我们就可以使用Gray code。这有一个伟大的属性,你只需要改变一位来获得一个新的数字。然而,如果k
答案 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。)