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

时间:2018-03-29 12:06:21

标签: 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,
    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),它会返回:<<1,0,0>>

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

2 个答案:

答案 0 :(得分:3)

简单

RewriteEngine on
RewriteCond %{REQUEST_URI} -f
RewriteRule ^ - [PT,END]

RewriteCond /folder1%/{REQUEST_URI} -f
RewriteRule ^/?(.+)/?$ /folder1/$1 [END]

RewriteCond /folder2%/{REQUEST_URI} -f
RewriteRule ^/?(.+)/?$ /folder2/$1 [END]

答案 1 :(得分:1)

你可以这样做:

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