【问题标题】:How to associate a "label" with each bit in an Erlang bitstring?如何将“标签”与 Erlang 位串中的每个位相关联?
【发布时间】:2018-03-29 21:32:20
【问题描述】:

假设我有以下位串:

B = <<0:5>>.

其中包含五个位:&lt;&lt;0,0,0,0,0&gt;&gt;

为了设置其中一个位,我使用了这个辅助函数:

-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).

这会给我这个位串:&lt;&lt;0,0,1,0,0&gt;&gt;

是否有可能以某种方式将“标签”与位串中的每个位相关联?

类似这样的:&lt;&lt;A1=0,A2=0,A3=1,A4=0,A5=0, … &gt;&gt;

这样我就可以通过它的标签来引用每个位,而不是像上面的函数那样通过它的索引来引用。通过编写一个具有类似签名的函数:set(Bits, BitLabel)。

可以这样调用:set(Grid, "A3")

在我的应用程序中,我使用 81 位的固定大小位串作为 9*9“网格”(行和列)。能够通过行/列标识符(例如A3)引用每个“单元格”将非常有用。

【问题讨论】:

  • 你不能只用位串来做到这一点。您必须使用带有该位串的辅助键/值数据类型(例如映射)。 key 可以是标签,value 可以是它的索引。

标签: erlang bits bitstring


【解决方案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).

【讨论】:

  • 这是一个很好的解决方案!感谢您的建议。我一直在考虑使用宏的想法(例如-define(a1, 0)),但我认为您的解决方案更好。
  • BitIndex 在你的函数中来自哪里?
  • @7stud 谢谢,它应该是BitIndex = 而不是B =。我已经修好了!
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多