code: @Override
    public String debugInfo()
    {
      final StringBuilder s = new StringBuilder("INTERNAL REPRESENTATION:\n");
      final Formatter f = new Formatter(s, Locale.ENGLISH);
  
      if (isEmpty()) {
        return s.append("null\n").toString();
      }
  
      // elements
      f.format("Elements: %s\n", toString());
  
      // raw representation of words
      for (int i = 0; i < firstEmptyWord; i++) {
        f.format(
            "words[%d] = %s (from %d to %d)\n",
            Integer.valueOf(i),
            toBinaryString(words[i]),
            Integer.valueOf(multiplyByWordSize(i)),
            Integer.valueOf(multiplyByWordSize(i + 1) - 1)
        );
      }
  
      // object attributes
      f.format("wordsInUse: %d\n", firstEmptyWord);
      f.format("size: %s\n", (size == -1 ? "invalid" : Integer.toString(size)));
      f.format("words.length: %d\n", words.length);
  
      // compression
      f.format("bitmap compression: %.2f%%\n", 100D * bitmapCompressionRatio());
      f.format("collection compression: %.2f%%\n", 100D * collectionCompressionRatio());
  
      return s.toString();
    }
docs: {@inheritDoc}