2011-01-23 40 views
6

我有一個二元M,使得34 =總是存在,其餘的可以在任何數量的數字之間變化,但總是整數。二進制到整型 - >二郎

M = [<<"34=21">>] 

當我運行這個命令我得到這樣

hd([X || <<"34=", X/binary >> <- M]) 

Answer -> <<"21">> 

回答我怎樣才能得到這是與使它儘可能高效而採取的最在乎的整數?

回答

20
[<<"34=",X/binary>>] = M, 
list_to_integer(binary_to_list(X)). 

即產生了整數21

+0

這是做的最有效方法是什麼?任何想法爲什麼沒有函數直接從二進制到整數? – BAR 2011-01-23 20:08:07

+1

,因爲二進制文件默認是一組整數。你在這裏所做的是用Erlang知道的整數字符表示來解釋爲一個字符串。基本上一個BIF做會「binary_to_list_to_integer」,因爲'<> = <<1,2,3>>`就已經給你只是「1」,這幾乎是二進制到整數的轉換,我猜。 – 2011-01-24 08:57:41

1

一個數的字符串表示可以通過N-二48被轉換。對於多位數可以摺疊在二進制,由數位位置的力量放大:

-spec to_int(binary()) -> integer(). 
to_int(Bin) when is_binary(Bin) -> 
    to_int(Bin, {size(Bin), 0}). 

to_int(_, {0, Acc}) -> 
    erlang:trunc(Acc); 
to_int(<<N/integer, Tail/binary>>, {Pos, Acc}) when N >= 48, N =< 57 -> 
    to_int(Tail, {Pos-1, Acc + ((N-48) * math:pow(10, Pos-1))}). 

這樣做的性能大約比使用list_to_integer(binary_to_list(X))選項慢100倍。

17

As of R16B,在BIF binary_to_integer/1可用於:

OTP-10300

增加了四個新的BIFS,erlang:binary_to_integer/1,2erlang:integer_to_binary/1erlang:binary_to_float/1erlang:float_to_binary/1,2。這些bifs的工作方式與 的列表工作方式類似,只是它們在 二進制文件上運行。在大多數情況下,從二進制文件轉換爲二進制文件比從列表轉換爲二進制文件的速度更快。

這些BIFS是自動導入的erlang源文件,並可以因此 而不二郎前綴使用。

因此,這將是這樣的:

[<<"34=",X/binary>>] = M, 
binary_to_integer(X).