如何将 "label" 与 Erlang 位串中的每一位相关联?
How to associate a "label" with each bit in an Erlang bitstring?
假设我有以下位串:
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>>
是否有可能以某种方式将 "label" 与位串中的每一位相关联?
像这样:<<A1=0,A2=0,A3=1,A4=0,A5=0, … >>
这样我就可以通过它的标签来引用每一位,而不是像上面的函数那样通过它的索引。通过编写具有类似于此签名的函数:set(Bits, BitLabel)
.
可以这样称呼:set(Grid, "A3")
在我的应用程序中,我使用 81 位的固定大小位串作为 9*9 "grid"(行和列)。能够通过其 row/column 标识符(例如 A3
)引用每个 "cell" 将非常有用。
不,您不能将标签与位相关联。由于标签和索引之间的映射在您的情况下似乎是固定的,因此我会创建另一个将标签映射到其索引的函数,如下所示:
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).
假设我有以下位串:
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>>
是否有可能以某种方式将 "label" 与位串中的每一位相关联?
像这样:<<A1=0,A2=0,A3=1,A4=0,A5=0, … >>
这样我就可以通过它的标签来引用每一位,而不是像上面的函数那样通过它的索引。通过编写具有类似于此签名的函数:set(Bits, BitLabel)
.
可以这样称呼:set(Grid, "A3")
在我的应用程序中,我使用 81 位的固定大小位串作为 9*9 "grid"(行和列)。能够通过其 row/column 标识符(例如 A3
)引用每个 "cell" 将非常有用。
不,您不能将标签与位相关联。由于标签和索引之间的映射在您的情况下似乎是固定的,因此我会创建另一个将标签映射到其索引的函数,如下所示:
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).