我想将一个零和一个列表转换为一个字符。 例如:
bitToChar([1,0,0,0,1,0,1]) = $Q
感谢。
答案 0 :(得分:5)
另一种方法是使用bit string comprehension:
X = [1,0,0,0,1,0,1],
<<C:7>> = << <<Bit:1>> || Bit <- lists:reverse(X) >>,
$Q == C.
也就是说,从列表中一次选择一个元素,并将每个元素用作正在构建的二进制文件中的一个位,最后将七位数字提取到变量C
中。
答案 1 :(得分:1)
您可以为每个$0
添加$0
(使其成为包含$1
和list_to_integer/2
s的字符串),反转列表,并使用基数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
这基本上等同于:{{1}}。
答案 2 :(得分:1)
$Q = lists:foldr(fun(X,Acc) -> X + (Acc bsl 1) end, 0,[1,0,0,0,1,0,1]).
答案 3 :(得分:0)
由于$Q
是整数值,所以您只需使用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