Каков хороший способ итерации числа через все возможные значения маски?

Получить битовую маску, в которой заданные биты описывают, где другое число может быть одно или ноль, а заданные биты должны быть нулевыми в этом числе. Какой хороший способ выполнить итерацию через все возможные значения?

Например:

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);
    }
}

Но это итерация через слишком большое количество чисел. Он должен быть не 2**32, а порядка 32.

7
задан templatetypedef 2 September 2011 в 00:28
поделиться