2016-10-17 2 views

답변

2

는 (그것을 $0들과 $1 s의 문자열로 만들려면) 목록을 반대하고, 기본 2list_to_integer/2를 사용 : 또한 lists:foldl을 사용할 수 있습니다

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

. 코드는 약간 시간이 오래이지만 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

은 당신이해야 할 모든 바이너리 기반의 번호로 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. 

은 목록에서 한 번에 하나 개의 요소를 선택하고, 약간의 각 요소를 사용 마지막으로 7 비트 숫자를 변수 C에 추출합니다.

+1

호기심 : 한 라이너의 임의의 크기 목록 (즉, Length = length (X).)을 변수에 저장하지 않고이를 사용하는 방법이 있습니까? 'C : Length'에서)? 나는'binary : decode_unsigned/1'을 시도했지만 bitstrings을 허용하지 않습니다. – Dogbert

관련 문제