namespace gc {
constexpr uint8_t ledPins[] {5,6,7,8,9,10,11,12};
}
//
// Display a bit string with leading zeros
//
template <typename T> void printBits(Stream &st, const T value) {
  constexpr uint8_t maxBits = (sizeof(T) * 8);
  constexpr T mask = (static_cast<T>(0x01) << (maxBits - 1));
  st.print(value); st.print(" ");
  uint8_t i = 0;
  while (i < maxBits) {
    st.print(((value << i++) & mask) ? 1 : 0);
    // Output a space after each nibble.
    if (!(i - ((i >> 2) << 2))) { st.print(" "); }
  }
  st.println();
}

//
// Light up LEDs 
//
template <typename T, size_t N> void bitsToLed(const T value, const uint8_t (&leds)[N]) {
  for (size_t i = 0; i < N; ++i) {
    digitalWrite(leds[i],((value >> i) & 0x01));
  }
}

void setup()
{
  Serial.begin(115200);
  randomSeed(analogRead(0));    // initialize the random number generator
  for (auto &led : gc::ledPins ) {pinMode(led, OUTPUT);}
}

void loop()
{
  uint8_t number = random(256);
  printBits(Serial,number);
  bitsToLed(number, gc::ledPins);
  delay(10000);
}