#include const unsigned long bitPos[32] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000 }; int multiplicity2 ( unsigned long n ) { int t = 0; if (n == 0) return -1; while ((n & 1) == 0) { ++t; n >>= 1; } return t; } unsigned long flipBit ( unsigned long code , int pos ) { if ((pos >= 0) && (pos <= 31)) { if (code & bitPos[pos]) printf("Person %d leaves room, ", pos); else printf("Person %d enters room, ", pos); code ^= bitPos[pos]; } return code; } void printBin ( unsigned long code , int s ) { int i; printf("code = "); for (i=s-1; i>=0; --i) if (code & bitPos[i]) printf("1"); else printf("0"); printf(", Persons inside : "); for (i=s-1; i>=0; --i) if (code & bitPos[i]) printf("%d",i); printf("\n"); } int main () { unsigned long code, i, k, s, t; printf("How many persons? "); scanf("%lu", &s); if (s == 0) { fprintf(stderr, "I expected a positive integer.\n"); exit(1); } t = (1 << s); code = 0; printf("i = 0, "); printBin(code,s); for (i = 1; i < t; ++i) { printf("i = %3d, ", i); k = multiplicity2(i); printf("k = %d, ", k); code = flipBit(code,multiplicity2(i)); printBin(code,s); } exit(0); }