private boolean increment(boolean[] input, int startPos, int endPos) {
    // Obtém o tamanho da entrada.
    int length = (endPos - startPos) + 1;

    // O incremento para resolver a nossa questão do trabalho sempre será 1, 
    // mas para que o código ficasse genérico, fizemos o array de incremento 
    // com o mesmo tamanho do de entrada mas com todos os seus valores inicializados com 0 -> false.
    boolean[] increment = new boolean[length];
    increment[length - 1] = true;

    // Informa se houve um buffer over flow.
    boolean overFlow = false;

    // O índice J é para evitar indexOutOfBound porque nem sempre os array têm o mesmo tamanho.
    int j = endPos;
    for (int i = length - 1; i >= 0; i--) {

      if ((!input[j]) && (!increment[i])) { // input = 0, increment = 0.
        if (!overFlow) {
          input[j] = false;
        }
        else {
          input[j] = true;
          overFlow = false;
        }
        // Se esta situação acontecer, acaba.
        break;
      }
      else if ((input[j] ^ increment[i])) { // input = 0, increment = 1 or input = 1, increment = 0.
        if (!overFlow) {
          input[j] = true;
        }
        else {
          input[j] = false;
          overFlow = true;
        }
      }
      else if ((input[j]) && (increment[i])) { // input = 1, increment = 1.
        if (!overFlow) {
          input[j] = false;
        }
        else {
          input[j] = true;
        }
        overFlow = true;
      }

      j--;
    }

    // Se no final teve um overflow significa que estourou o valor máximo, 
    // então retorna false que significa que não da mais para incrementar;
    // Se não teve overflow, retorna true dizendo que a operação foi concluída com sucesso.
    return !overFlow;
  }