Как связать "метку" с каждым битом в цепочке битов Эрланга?
Предположим, у меня есть следующая цепочка битов:
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).