Почему при объединении двух списков из бинарных чисел, в итоговом списке числа преобразуются в десятичный формат?

Рейтинг: 1Ответов: 2Опубликовано: 28.04.2015

Конвертирую десятичное число в двоичный формат:

A = integer_to_list(5, 2).

И добавляю к полученному списку список из нулей:

A ++ [0, 0, 0, 0, 0].

Получаю [49, 48, 49, 0, 0, 0, 0, 0]. Нужно при объединении получить [1, 0, 1, 0, 0, 0, 0, 0].

Ответы

▲ 2Принят

Дело в том, что у вас получается список символов "101", а не чисел. Символы имеют числовое представление, согласно таблице ASCII, и символу 0 соответствует код 48, а символу 1, соответственно, 49.

Попробуйте вычесть код цифры 0 из каждого элемента массива, получаемого после вызова функции integer_to_list(5, 2).

Это можно сделать, например, так:

A = lists:map(fun(X) -> X-$0 end, integer_to_list(5, 2)).
▲ 3

Немного более вменяемый способ:

i2bl(I) when is_integer(I) -> 
  i2bl(<<I>>, []).

i2bl(<<>>, Acc) ->
  Acc;
i2bl(<<B:1, Rest/bitstring>>, Acc) -> 
  i2bl(Rest, [B|Acc]).

Пример использования:

1> i2bl(5).
[1,0,1,0,0,0,0,0]