大部分時間,Erlang使用列表和遞歸,所以我認爲它是單獨通過每一位而不是嘗試以迭代方式索引每一位的慣用方法。
The documentation on how to work with bitstrings is here.爲了創建數字21的位串,我們可以寫<<21>>
。由於二進制成員的默認類型是整數,並且整數的默認大小是8,因此它將產生一個類似於00010101
的位串。如果你想具體得到一個值的最後N個字節是<<Value:N>>
。爲了得到21的最後5位,我們可以說<<21:5>>
這將產生。
我寫了下面模塊做你想做什麼:
-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
設置爲位串的其餘部分。根據Bit的值,我們決定是否將當前項目添加到列表中。
實施例下面的調用:
> 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]