2016-10-17 4 views

答えて

2

あなたは、(それ$0 sおよび$1 sの文字列を作るために)それらのそれぞれに$0を追加し、リストを反転し、ベース2list_to_integer/2を使用することができます。

1> list_to_integer(lists:reverse([N + $0 || N <- [1,0,0,0,1,0,1]]), 2) == $Q. 
true 

ます。またlists:foldlを使用することができます。コードは少し長いですが、それはlist_to_binaryを使用していません:

1> element(2, lists:foldl(fun(Digit, {Mul, Acc}) -> {Mul * 2, Acc + Digit * Mul} end, {1, 0}, Xs)) == $Q.    true 

これは基本的にやってと同等です:1 * 1 + 0 * 2 + 0 * 4 + 0 * 8 + 1 * 16 + 0 * 32 + 1 * 64を。 $Q以来

+0

ありがとうございます、それを行う他の方法はありますか? – soddik

+0

私は 'lists:foldl/3'を使って別の方法を追加しました。 – Dogbert

+1

しかし、私はそれを比較したいとは思わないような結果を表示する必要があります。コンソールでは$ Qでなければなりません。 – soddik

1
$Q = lists:foldr(fun(X,Acc) -> X + (Acc bsl 1) end, 0,[1,0,0,0,1,0,1]). 
0

は、あなたがしなければならないすべては、ベースの数を2進数から10進数へのベース番号からBitToCharの変換に使用される整数値です。

to_decimal(X) -> 
    to_decimal(lists:reverse(X), 1, 0). 

% you can validate that if H = 1 then add, if other not but I omitted this validation 
to_decimal([H | T], Times, Acc) -> 
    to_decimal(T, 2 * Times, H * Times + Acc); 

to_decimal([], _Times, Acc) -> Acc. 

そしてそれは整数を返します。

最も簡単な変換があります。あなたのケースで は:

> $Q = 81. 
81 

> $Q == 81. 
true 
6

それを行うための別の方法は、使用することですbit string comprehension:ある

X = [1,0,0,0,1,0,1], 
<<C:7>> = << <<Bit:1>> || Bit <- lists:reverse(X) >>, 
$Q == C. 

は、リストから一度に1つの要素を選択し、ビットとして各要素を使用します最後に7ビットの数値を変数Cに抽出します。

+1

ちょうど興味深いのは、1つのライナーで任意のサイズのリストに対してこれを行う方法です(つまり、 'Length = length(X).'を変数に格納せずに、 'C:Length'で)?私は 'binary:decode_unsigned/1'を試みましたが、ビットストリングは受け付けません。 – Dogbert