Long.toString
は上位ビットが0だった場合に削れた文字列を返してしまいます。
完全な16進数表記を得るにはString.format("%016x", number)
を利用する例がよく引っかかりますが、内部処理を見ると結構重そうなことをしています。
一方、Java 17
からは、このような場合に利用可能なHexFormat
というクラスが追加されました。
toHexDigits
の内部実装を読んだ所、以下のような形で、ほぼビット演算のみで実装されていました。
ベンチマークは取っていませんが、これなら確実にString.format
よりも高速でしょう。
Java内から引用public String toHexDigits(long value) { byte[] rep = new byte[16]; rep[0] = (byte)toHighHexDigit((byte)(value >>> 56)); rep[1] = (byte)toLowHexDigit((byte)(value >>> 56)); rep[2] = (byte)toHighHexDigit((byte)(value >>> 48)); rep[3] = (byte)toLowHexDigit((byte)(value >>> 48)); rep[4] = (byte)toHighHexDigit((byte)(value >>> 40)); rep[5] = (byte)toLowHexDigit((byte)(value >>> 40)); rep[6] = (byte)toHighHexDigit((byte)(value >>> 32)); rep[7] = (byte)toLowHexDigit((byte)(value >>> 32)); rep[8] = (byte)toHighHexDigit((byte)(value >>> 24)); rep[9] = (byte)toLowHexDigit((byte)(value >>> 24)); rep[10] = (byte)toHighHexDigit((byte)(value >>> 16)); rep[11] = (byte)toLowHexDigit((byte)(value >>> 16)); rep[12] = (byte)toHighHexDigit((byte)(value >>> 8)); rep[13] = (byte)toLowHexDigit((byte)(value >>> 8)); rep[14] = (byte)toHighHexDigit((byte)value); rep[15] = (byte)toLowHexDigit((byte)value); try { return jla.newStringNoRepl(rep, StandardCharsets.ISO_8859_1); } catch (CharacterCodingException cce) { throw new AssertionError(cce); } }
また、このクラスには16進数文字列 -> int
のようなデコード関数も実装されており、相互変換に利用できます。