如何翻转 Erlang 位串中的单个特定位?
How to flip a single, specific bit in an 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,
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)
时,我希望函数 return 一个新的位串(例如 NewB
),其中第一位(在索引 0 处)具有从 0 翻转到 1。
这样,如果我要调用 get_bits(NewB)
,它会 return:<<1,0,0>>
如何翻转 Erlang 位串中的单个特定位?
你可以这样做:
set_bit(Bin, N) ->
R = bit_size(Bin) - N - 1,
<< A:N, _:1, B:R >> = Bin,
<< A:N, 1:1, B:R >>.
更简单
set_bit(Bin, N) ->
<< A:N/bits, _:1, B/bits >> = Bin,
<< A/bits, 1:1, B/bits >>.
我有以下模块:
-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)
时,我希望函数 return 一个新的位串(例如 NewB
),其中第一位(在索引 0 处)具有从 0 翻转到 1。
这样,如果我要调用 get_bits(NewB)
,它会 return:<<1,0,0>>
如何翻转 Erlang 位串中的单个特定位?
你可以这样做:
set_bit(Bin, N) ->
R = bit_size(Bin) - N - 1,
<< A:N, _:1, B:R >> = Bin,
<< A:N, 1:1, B:R >>.
更简单
set_bit(Bin, N) ->
<< A:N/bits, _:1, B/bits >> = Bin,
<< A/bits, 1:1, B/bits >>.