ほとんどの場合、Erlangはリストと再帰を処理するため、各ビットに繰り返しインデックスを付けるのではなく、各ビットを個別に調べるのが慣用的だと思います。
ビット文字列の操作方法に関するドキュメントはこちらです。 数値21からビット文字列を作成するために、を書くことができます<<21>>
。バイナリのメンバーのデフォルトの型は整数であり、整数のデフォルトのサイズは8であるため、のようなビット文字列が生成されます00010101
。値の最後のNバイトを具体的に取得する場合は、です<<Value:N>>
。21の最後の5ビットを取得するために、<<21:5>>
どちらが生成されるかを言うことができます10101
。
私はあなたが望むことをするために次のモジュールを書きました:
-module(bitmask).
-export([get_subarray_from_bitarray/2]).
get_subarray_from_bitarray(Bitstring, List) ->
get_subarray_from_bitarray_loop(Bitstring, List, []).
get_subarray_from_bitarray_loop(_Bits, [], Gathered) ->
io:format("End of list~n", []),
lists:reverse(Gathered);
get_subarray_from_bitarray_loop(<<>>, _Others, Gathered) ->
io:format("End of bitstring~n", []),
lists:reverse(Gathered);
get_subarray_from_bitarray_loop(<<Bit:1, Rest/bitstring>>, [Item | Others], Gathered) ->
io:format("Bit: ~w ~n", [Bit]),
case Bit of
1 -> get_subarray_from_bitarray_loop(Rest, Others, [Item | Gathered]);
0 -> get_subarray_from_bitarray_loop(Rest, Others, Gathered)
end.
リスト内のビットまたはアイテムが不足すると、最初の2つの句は最終的なリストを返します。重要なビット構文は、最後の句の先頭にあり<<Bit:1, Rest/bitstring>>
ます。これにより、Bit
の値がビット文字列の最初のビットの値に設定Rest
され、残りのビット文字列に設定されます。ビットの値に応じて、現在のアイテムをリストに追加するかどうかを決定します。
以下の呼び出し例:
> bitmask:get_subarray_from_bitarray(<<21:5>>, [1, 3, 5, 42, 23]).
Bit: 1
Bit: 0
Bit: 1
Bit: 0
Bit: 1
End of list
[1,5,23]
> bitmask:get_subarray_from_bitarray(<<31>>, [1, 3, 5, 42, 23]).
Bit: 0
Bit: 0
Bit: 0
Bit: 1
Bit: 1
End of list
[42,23]
> bitmask:get_subarray_from_bitarray(<<5:3>>, [1, 3, 5, 42, 23]).
Bit: 1
Bit: 0
Bit: 1
End of bitstring
[1,5]