code: public static String getBankIdentifier(IBAN iban) {
          int index = CountryCodes.indexOf(iban.getCountryCode());
          if (index > -1) {
              int data = BANK_CODE_BRANCH_CODE[index];
              int bankIdBegin = data & BANK_IDENTIFIER_BEGIN_MASK;
              int bankIdEnd = (data & BANK_IDENTIFIER_END_MASK) >>> BANK_IDENTIFIER_END_SHIFT;
              return bankIdBegin != 0 ? iban.toPlainString().substring(bankIdBegin, bankIdEnd) : null;
          }
          return null;
      }
docs: Returns the bank identifier from the given IBAN, if available.
  <p><strong>Finland (FI): </strong>
  The spec mentions both "Not in use" and "Position 1-3 indicate the bank or banking group." I have taken "bank
  or banking group" to be more or less synonymous with Bank Identifier and return it as such.</p>
  <p><strong>Slovenia (SI): </strong>
  The five digits following the checksum encode the financial institution and sub-encode the branch identifier
  if applicable, depending on the type of financial institution. The library returns all five digits as the bank
  identifier and never returns a branch identifier.</p>
  <p><strong>Republic of Kosovo (XK): </strong>
  The four digits following the checksum encode the Bank ID, and the last two of these four sub-encode the
  branch ID. The library returns all four digits as the bank identifier. For example: if the IBAN has "1234" in
  these positions, then the bank identifier is returned as "1234" and the branch identifier as "34".</p>
  @param iban an iban to evaluate. Cannot be null.
  @return the bank ID for this IBAN, or null if unknown.