Учитывая битовую маску, где установленные биты описывают, где другое число может быть одним или нулем, а неустановленные биты должны быть равны нулю в этом числе. Какой хороший способ перебрать все возможные значения?
Например:
000 returns [000]
001 returns [000, 001]
010 returns [000, 010]
011 returns [000, 001, 010, 011]
100 returns [000, 100]
101 returns [000, 001, 100, 101]
110 returns [000, 010, 100, 110]
111 returns [000, 001, 010, 011, 100, 101, 110, 111]
Самый простой способ сделать это - сделать это так:
void f (int m) {
int i;
for (i = 0; i <= m; i++) {
if (i == i & m)
printf("%d\n", i);
}
}
Но это повторяет слишком много чисел. Должно быть порядка 32, а не 2 ** 32.