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
いつか読むはずっと読まない:リンの眼、クウィルの手
裏世界ピクニック ふたりの怪異探検ファイル (ハヤカワ文庫JA)
- 作者: 宮澤伊織,shirakaba
- 出版社/メーカー: 早川書房
- 発売日: 2017/02/23
- メディア: 文庫
- この商品を含むブログ (3件) を見る
みなさまのおかげで、『裏世界ピクニック』続きを出せることになりました。やったー
— 魚蹴/宮澤伊織 (@walkeri) 2017年4月12日