0과 1의 목록을 char로 변환하고 싶습니다. 예 :바이너리 목록을 char로 변환하는 방법은 무엇입니까?
bitToChar([1,0,0,0,1,0,1]) = $Q
감사합니다. 당신은 그들 각각에 $0
을 추가 할 수 있습니다
0과 1의 목록을 char로 변환하고 싶습니다. 예 :바이너리 목록을 char로 변환하는 방법은 무엇입니까?
bitToChar([1,0,0,0,1,0,1]) = $Q
감사합니다. 당신은 그들 각각에 $0
을 추가 할 수 있습니다
는 (그것을 $0
들과 $1
s의 문자열로 만들려면) 목록을 반대하고, 기본 2
와 list_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
이후
$Q = lists:foldr(fun(X,Acc) -> X + (Acc bsl 1) end, 0,[1,0,0,0,1,0,1]).
은 당신이해야 할 모든 바이너리 기반의 번호로 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
그것을 할 수있는 또 다른 방법은 사용하는 것입니다 bit string comprehension :이다
X = [1,0,0,0,1,0,1],
<<C:7>> = << <<Bit:1>> || Bit <- lists:reverse(X) >>,
$Q == C.
은 목록에서 한 번에 하나 개의 요소를 선택하고, 약간의 각 요소를 사용 마지막으로 7 비트 숫자를 변수 C
에 추출합니다.
호기심 : 한 라이너의 임의의 크기 목록 (즉, Length = length (X).)을 변수에 저장하지 않고이를 사용하는 방법이 있습니까? 'C : Length'에서)? 나는'binary : decode_unsigned/1'을 시도했지만 bitstrings을 허용하지 않습니다. – Dogbert
감사합니다. 다른 방법이 있습니까? – soddik
'lists : foldl/3'을 사용하여 다른 방법을 추가했습니다. – Dogbert
하지만 나는 그것을 비교하고 싶지 않은 결과를 출력 할 필요가있다. 콘솔에서 $ Q이어야한다. – soddik