Elixirで符号付整数値を16進数表示する方法
符号付10進数の数字を16進数で表記する手法をご紹介します。
マイナス値を「2の補数」表現を行う方法になります。
結論から書きます。パターンマッチを使って、一旦バイナリで取り出してBase16でエンコードすればOKです。
iex(1)> ( <<x::binary>> = <<-100::integer-signed-32>> ) |> Base.encode16
"FFFFFF9C"
iex(2)> ( <<x::binary>> = <<-100::integer-signed-64>> ) |> Base.encode16
"FFFFFFFFFFFFFF9C"
上記の例では、-100をそれぞれ符号付32bit整数、符号付64bit整数として解釈しています。
iex(3)> <<x::binary>> = <<-100::integer-signed-32>>
<<255, 255, 255, 156>>
単なるバイナリ変換の場合は、上記の表記になるのでBaseモジュールが必用になります。
モジュール化
以下はモジュール化したものです。ご参考まで。
defmodule IntHex do
def i32_hex(val) do
( <<x::binary>> = <<val::integer-signed-32>> )
|> Base.encode16
end
end
リスト化した数値をmapで16進数変換しています。
iex(4)> [-883353469, -788829382, 1699715283] |> Enum.map( &IntHex.i32_hex &1 )
["CB591883", "D0FB6B3A", "654F98D3"]
16進数をHexという名前はElixir/Erlangのパッケージ管理ツールと被ってるので、微妙にネット検索がしにくいですよね。それにしても、バイナリパターンマッチは非常に強力ですね。