#include #include #include extern const char *__progname; static int codelen; static int mindist; static unsigned int codes[16777216]; static unsigned int codemask; static int listsize; static int nchosen; static void genlist(void) { int i; int j; unsigned int t; listsize = 1 << codelen; codemask = listsize - 1; for (i=codemask;i>=0;i--) codes[i] = i; for (i=codemask;i>=0;i--) { j = random() & codemask; if (i != j) { t = codes[i]; codes[i] = codes[j]; codes[j] = t; } } nchosen = 0; } static void print(unsigned int c) { int i; for (i=codelen-1;i>=0;i--) printf("%d",(c>>i)&1); printf("\n"); } static int hamdist(unsigned int a, unsigned int b) { a ^= b; a = ((a >> 1) & 0x55555555) + (a & 0x55555555); a = ((a >> 2) & 0x33333333) + (a & 0x33333333); a = ((a >> 4) & 0x0f0f0f0f) + (a & 0x0f0f0f0f); a = ((a >> 8) & 0x00ff00ff) + (a & 0x00ff00ff); return(((a>>16)&0x0000ffff)+(a&0x0000ffff)); } static void filter(unsigned int c) { int i; int j; j = nchosen; for (i=nchosen;i= mindist) { if (j != i) codes[j] = codes[i]; j ++; } } listsize = j; } int main(int, char **); int main(int ac, char **av) { if (ac != 3) { fprintf(stderr,"Usage: %s code-length min-Hamming-distance\n",__progname); exit(1); } codelen = atoi(av[1]); mindist = atoi(av[2]); if (codelen < 2) { fprintf(stderr,"%s: min code length is 2\n",__progname); exit(1); } if (codelen > 24) { fprintf(stderr,"%s: max code length is 24\n",__progname); exit(1); } srandom(time(0)); genlist(); while (listsize > nchosen) { nchosen ++; print(codes[nchosen-1]); filter(codes[nchosen-1]); } return(0); }