int s = (1 << k) - 1; while (!(s & 1 << N)) { // do stuff with s int lo = s & ~(s - 1); // lowest one bit int lz = (s + lo) & ~s; // lowest zero bit above lo s |= lz; // add lz to the set s &= ~(lz - 1); // reset bits below lz s |= (lz / lo / 2) - 1; // put back right number of bits at end }