Good, Bad, So-So?

The question was, in positive multiples of 15, what bits are set to 1?

Turbo C has specific extensions for dealing with bits in a byte, but I was trying for a more standard C way of counting and displaying the set bits in an unsigned long of 4 bytes.

Suggestions encouraged.

Code:
/*
4,294,967,295 == ULONG_MAX

*/

#include <stdio.h>
//include <limits.h>  //for Turbo C only
#define ULONG_MAX 4294967295  //for non Turbo C compilers

int main() {
  int i, j, k, got1, cbits[33]; //cbits shows the bits, when displayed
  unsigned long n; 
  unsigned long a[33];      //power of 2 array

  printf("\n\n Sizeof(unsigned long): %d maximum unsigned long is: %lu",sizeof(unsigned long),ULONG_MAX);
  n=2;
  i=1;
  a[i]=i;
  /* build powers of 2 array for bit work */
  while(n < ULONG_MAX && n > 0) { 
    a[++i] = n;
    printf("\n n == %lu  i== %d", n, i);
    if(i % 22==0)  {
      printf("\n   press enter to continue");
      getchar();
    }
    n *= 2;
  }

  /* processing section */
  k=0;
  n=15;
  while(n < ULONG_MAX) {
    for(j=0;j<33;j++)         //clear the display array
      cbits[j]=0;

    for(i=1, got1=0;i<33;i++) {
      if(n & a[i]) {       //AND with the mask
        ++got1;          //got a 1 bit
        cbits[i] = 1;     //set the cbit index that represents the bit
      }
    }
    if((got1 == 4 ) || (got1 > 25))  {  //displays number, # of bits set, and bytes
      printf("\n#%6d: N %8lu has %d 1 bits: ", ++k, n, got1);
      for(j=32;j>0;j--) {
        printf("%d", cbits[j]);
        if((j % 8==1) ) //&& j < 32)
          putchar(' ');
      }
      if(k%22==0) {
        printf("\n hit enter to continue");
        getchar();
      }
    }
    n+=15;
  }
  printf("\n\n\t\t\t     press enter when ready");
  i = getchar();
  return 0;
}