8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Elixirで符号付整数値を16進数表示する方法

Last updated at Posted at 2019-01-18

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のパッケージ管理ツールと被ってるので、微妙にネット検索がしにくいですよね。それにしても、バイナリパターンマッチは非常に強力ですね。

8
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?