【问题标题】:How to flip a single, specific bit in an Erlang bitstring?如何翻转 Erlang 位串中的单个特定位?
【发布时间】:2018-03-29 12:06:21
【问题描述】:

我有以下模块:

-module (bitutils).
-export ([get_bits/1, get_bit/2, set_bit/2]).

get_bits(B) ->
    << <<X>> || <<X:1>> <= B >>.

get_bit(Bin, N) ->
    << _:N/bitstring, Bit:1, _/bitstring >> = Bin,
    Bit.

set_bit(Bin, N) ->
    << A:N, _:1, B/bitstring >> = Bin,
    << A:N, 1:1, B >>.

Erlang REPL 会话(示例):

Eshell V9.3  (abort with ^G)

1> c(bitutils).
{ok,bitutils}

2> B = <<0:3>>.
<<0:3>>

3> bitutils:get_bits(B).
<<0,0,0>>

4> bit_size(B).
3

5> byte_size(B).
1

6> bitutils:get_bit(B, 0).
0

7> bitutils:get_bit(B, 1).
0

8> bitutils:get_bit(B, 2).
0

9> bitutils:set_bit(B, 0).
** exception error: bad argument
     in function  bitutils:setBit/2 (bitutils.erl, line 12)

问题:

我不明白为什么set_bit 函数会抛出异常。

在上面的示例中,当我调用 set_bit(B, 0) 时,我希望函数返回一个新的位串(例如 NewB),其中第一位(索引 0 处)已从 0 翻转到 1。

这样,如果我调用get_bits(NewB),它将返回:&lt;&lt;1,0,0&gt;&gt;

如何翻转 Erlang 位串中的单个特定位?

【问题讨论】:

    标签: binary erlang bitstring


    【解决方案1】:

    更简单

    set_bit(Bin, N) ->
            << A:N/bits, _:1, B/bits >> = Bin,
            << A/bits, 1:1, B/bits >>.
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      set_bit(Bin, N) ->
              R = bit_size(Bin) - N - 1, 
              << A:N, _:1, B:R >> = Bin,
              << A:N, 1:1, B:R >>.
      

      【讨论】:

      • 感谢您为我指明正确的方向。像魅力一样工作。我将尝试弄清楚如何制作一个可以在此基础上在 0 和 1 之间“切换”的通用函数。
      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多