9
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?

【TIPS】ビットストリングのカウントが無い…

Last updated at Posted at 2023-12-24

この記事は、Elixir Advent Calendar 2023 シリーズ14 の14日目です


【本コラムは、2分で読め、2分で試せます】

piacere です、ご覧いただいてありがとございます :bow:

Elixirのビットストリングって、バイナリデータを扱う際に便利ですが、「データのサイズ」をカウントする関数が、Bitwise モジュールにありません
image.png

また、ビットストリングは Enumerable プロトコルの実装では無いため、Enum モジュールも使えません

iex> <<1, 2, 3>> |> Enum.count
** (Protocol.UndefinedError) protocol Enumerable not implemented for <<1, 2, 3>> of type BitString
    (elixir 1.16.0) lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir 1.16.0) lib/enum.ex:178: Enumerable.count/1
    (elixir 1.16.0) lib/enum.ex:702: Enum.count/1
    iex:18: (file)

今回、その解決+αをTIPSとしてまとめておきました

ビットストリングのカウント

ビットストリングのカウントは、Kernel モジュールの下記でできます

iex> <<1, 2, 3>> |> byte_size 
3

なおビットストリングは、ダブルクォートで囲まれた文字列と互換性があるため、String モジュールを使うこともできます

iex> <<1, 2, 3>> |> String.length
3

逆も然りです

iex> "Xmasケーキ" |> byte_size 
13

なおバイトサイズでは無く、ビットサイズを取得することもできます

iex> <<1, 2, 3>> |> bit_size 
24

マルチバイト文字列だと、1文字3バイト使うので、4 x 8 + 3 x 3 x 8で104ビットとなります

iex> "Xmasケーキ" |> bit_size 
104

型を指定すると、バイトサイズ/ビットサイズが変わります

iex> <<1::big-integer-size(64), 2::big-integer-size(128)>> |> byte_size
24
iex> _ |> bit_size
192
9
1
0

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
9
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?