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

Binary 如何翻转Erlang位字符串中的单个特定位?,binary,erlang,bitstring,Binary,Erlang,Bitstring,我有以下模块: -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,

我有以下模块:

-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_bitB,0时,我希望函数返回一个新的位字符串,例如NewB,其中索引0处的第一位已从0翻转到1

这样,如果我调用get_bitsNewB,它将返回:


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

您可以这样做:

设置\u bitBin,N-> R=位大小为-N-1, >=Bin, >.
您可以这样做:

设置\u bitBin,N-> R=位大小为-N-1, >=Bin, >. 简单的

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

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

谢谢你给我指明了正确的方向。工作得很有魅力。我将试图找出如何制作一个通用函数,可以在0和1之间进行切换。感谢您为我指明了正确的方向。工作得很有魅力。我将试图找出如何创建一个通用函数,该函数可以在此基础上在0和1之间切换。