2011-01-23 28 views
6

Tôi có một nhị phân M sao cho 34 = luôn luôn có mặt và phần còn lại có thể thay đổi giữa bất kỳ số chữ số nào nhưng sẽ luôn là số nguyên.Binary to Integer -> Erlang

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

Khi tôi chạy lệnh này tôi nhận được một câu trả lời như

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

Answer -> <<"21">> 

Làm thế nào tôi có thể có được điều này là một số nguyên với sự chăm sóc nhất đưa đến làm cho nó càng hiệu quả càng tốt?

Trả lời

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

Đó mang số nguyên 21

+0

Đây có phải là cách hiệu quả nhất để làm điều đó? Bất kỳ ý tưởng tại sao không có một chức năng để đi trực tiếp từ nhị phân đến số nguyên? – BAR

+1

vì nhị phân theo mặc định là một tập hợp số nguyên. Những gì bạn đã làm ở đây được sử dụng các đại diện của các ký tự số nguyên mà Erlang biết để giải thích như là một chuỗi. Về cơ bản một BIF để làm điều đó sẽ 'binary_to_list_to_integer' vì '<> = <<1,2,3>>' sẽ cung cấp cho bạn chỉ '1' và đó là khá nhiều nhị phân-to-số nguyên chuyển đổi, tôi đoán. –

1

Một chuỗi đại diện của một số có thể được chuyển đổi bởi N-48. Đối với số nhiều chữ số bạn có thể gấp lên nhị phân, nhân với sức mạnh của các vị trí của các chữ số:

-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))}). 

Việc thực hiện này là khoảng chậm hơn so với sử dụng tùy chọn list_to_integer(binary_to_list(X)) 100 lần.

17

As of R16B, các BIF binary_to_integer/1 thể được sử dụng:

OTP-10300

thêm bốn BIFs mới, erlang:binary_to_integer/1,2, erlang:integer_to_binary/1, erlang:binary_to_float/1erlang:float_to_binary/1,2. Các bif này hoạt động tương tự như cách đối tác danh sách của chúng hoạt động, ngoại trừ chúng hoạt động trên nhị phân. Trong hầu hết các trường hợp, chuyển đổi từ và sang nhị phân là nhanh hơn chuyển đổi từ và sang danh sách là .

Các bif này được tự động nhập vào các tệp nguồn erlang và có thể do đó được sử dụng mà không cần tiền tố erlang.

Vì vậy, đó sẽ như thế nào:

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

cuối cùng họ làm điều đó .. – BAR