エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

ビットをもっと自由自在に扱える言語

Elixir を学んでいます。

ビットをもっと自由自在に扱えるようにしてみた

7 年ほど前にビット操作を支援するコードを C++ で書いたことがあります。

ビットをもっと自由自在に扱える言語

同じようなこと、それ以上のことが Elixir は言語として用意されています。20 年前の自分に教えてやりたかった。

# color.exs

defmodule Color do
  def from16to24(bitmap) do
    (for << r::5, g::6, b::5 <- bitmap >>, do: <<r::5, 0::3, g::6, 0::2, b::5, 0::3>>) |> Enum.join
  end

  def from24to16(bitmap) do
    (for << r::5, _::3, g::6, _::2, b::5, _::3 <- bitmap >>, do: <<r::5, g::6, b::5>>) |> Enum.join
  end
end


iex で実行。

$ iex
iex> c "color.exs"
iex> Color.from16to24 <<0xffff::16>> 
<<248, 252, 248>>
iex> Color.from24to16 <<255, 255, 255>>
<<255, 255>>

元祖ビットをもっと自由自在に扱える言語

Erlang でも。

% color.erl

-module(color).
-export([from16to24/1, from24to16/1]).

from16to24(Bitmap) ->
  << <<R:5, 0:3, G:6, 0:2, B:5, 0:3>> || <<R:5, G:6, B:5>> <= Bitmap >>.

from24to16(Bitmap) ->
  << <<R:5, G:6, B:5>> || <<R:5, _:3, G:6, _:2, B:5, _:3>> <= Bitmap >>.


erl で実行。

$ erl
> c(color).
> color:from16to24(<<255, 255, 255, 255>>).
<<"øüøøüø">>
> color:from24to16(<<255, 255, 255>>).     
<<"ÿÿ">>

文字として表示できる値の場合に文字として表示してしまうのやめて欲しいぞ。

> <<R:5, G:6, B:5>> = color:from24to16(<<255, 255, 255>>), io:format("~p~n", [[R, G, B]]).
[31,63,31]
ok

いつか読むはずっと読まない:リンの眼、クウィルの手