2013-06-04 60 views
2

我是erlang的新手,有一個可能很簡單的問題。二進制訪問變量二進制位 - Erlang

比方說,我有類似A = [ 7, 203, 15, 11 ]和一些二進制B。在運行時生成AB。 有沒有一種簡單的方法來檢查B中由A中描述的位置中的位。 所以首先要檢查的是7,下一個203等等。

我意識到我可以對A進行排序並遍歷B,直到我處於A之內的位置,但對於這樣一個簡單的問題似乎有點過於頂端。

在此先感謝!

+0

ooops,已經回答了。 – Pascal

回答

2

你可以做類似如下模塊:

-module(bits). 

-export([select/2]). 

select(Pattern, Bitstring) -> select(Pattern, Bitstring, []). 

select([], _, Acc) -> lists:reverse(Acc); 
select([H | T], Bitstring, Acc) -> 
    Pos = H - 1, 
    <<_:Pos/bitstring, B:1/integer, _/bitstring>> = Bitstring, 
    select(T, Bitstring, [B | Acc]). 
+0

heh ..使用遞歸而不是列表理解的相同匹配..但是你的版本從1開始計算位,而不是0 .. – Kaos

+0

返回一個整數列表,因爲它是Erlang我當然從1開始計數:-) –

0

例使用列表理解:

A=[0,1,2,3,4,5,6,7]. 
B = <<"">>. 

[begin 
    <<_:D/bits, Bit:1/bits, _/bits>> = B, 
    Bit 
end 
|| D <- A]. 

給出:

[<<0:1>>, 
<<0:1>>, 
<<1:1>>, 
<<1:1>>, 
<<0:1>>, 
<<0:1>>, 
<<0:1>>, 
<<0:1>>] 

這是爲0x30,即 '0'。

編輯:b,修正了bug ...