Как связать "метку" с каждым битом в цепочке битов Эрланга?

Предположим, у меня есть следующая цепочка битов:

B = <<0:5>>.

Который содержит пять битов: <<0,0,0,0,0>>

Чтобы установить один из этих битов, я использую эту вспомогательную функцию:

-spec set(Bits :: bitstring(), BitIndex :: non_neg_integer()) -> bitstring().

set(Bits, BitIndex) ->
    << A:BitIndex/bits, _:1, B/bits >> = Bits,
    << A/bits, 1:1, B/bits >>.

Я называю функцию так:

B2 = bit_utils:set(B, 2). % Referring to a specific bit by its index (2).

Что даст мне эту цепочку: <<0,0,1,0,0>>

Можно ли как-то связать "метку" с каждым битом в цепочке битов?

Что-то вроде этого: <<A1=0,A2=0,A3=1,A4=0,A5=0, … >>

Так что я могу ссылаться на каждый бит по его метке, а не по индексу, как в приведенной выше функции. Написание функции с подписью сродни этому: set(Bits, BitLabel),

Который можно назвать так: set(Grid, "A3")

В моем приложении я использую цепочку битов фиксированного размера из 81 бита в качестве "сетки" 9*9 (строки и столбцы). Возможность ссылаться на каждую "ячейку" по ее идентификатору строки / столбца (например, A3) было бы очень полезно.

1 ответ

Решение

Нет, вы не можете ассоциировать ярлык с битом. Поскольку сопоставление между меткой и индексом в вашем случае, по-видимому, является фиксированным, я бы вместо этого создал другую функцию, которая отображает метку на ее индекс следующим образом:

position(a1) -> 0;
position(a2) -> 1;
...

а затем использовать это в set:

set(Bits, Label) ->
    BitIndex = position(Label),
    << A:BitIndex/bits, _:1, B/bits >> = Bits,
    << A/bits, 1:1, B/bits >>.

Теперь вы можете позвонить set/2 с атомом, который является меткой:

B2 = set(B, a1),
B3 = set(B2, c2).
Другие вопросы по тегам