#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(int argc, char **argv) {
uint32_t lfsr = 1, buf_bits = 0;
uint16_t valid = 0, old = 0, buf_cnt = 0, out_cnt = 0;
do {
uint32_t mask, b1, b2;
b1 = lfsr & 1;
lfsr = (lfsr >> 1) ^ (0xD0000001u & -(uint32_t)b1);
b2 = lfsr & 1;
lfsr = (lfsr >> 1) ^ (0xD0000001u & -(uint32_t)b2);
++valid;
old += b2;
mask = 1;
do {
uint32_t next = b1 ^ (old & mask);
if( next ) {
++buf_cnt;
buf_bits = (buf_bits << 1) | !!b1;
}
b1 = next << 1;
mask <<= 1;
} while( valid & mask );
if( b1 ) old |= mask; else old &= ~mask;
++valid;
if( buf_cnt >= 16 ) {
buf_cnt -= 16;
printf( "%04" PRIx16, (buf_bits >> buf_cnt) & 0xFFFFu );
if( 19 == (out_cnt % 20) ) printf("\n");
++out_cnt;
}
} while( out_cnt < 1000 );
return 0;
}