8

在erlang中,有对整数进行按位运算,例如:

1>  127 bsl 1.
254

还可以将整数打包成字节序列

<< 16#7F, 16#FF >>

是否有可能,或者是否有任何运算符或 BIF 可以对二进制打包数据执行按位运算(例如 AND、OR、XOR、SHL、SHR)?

例如(如果 bsl 处理二进制包 - 它没有):

1>  << 16#7F, 16#FF >> bsl 1.
<< 255, 254 >>
4

2 回答 2

6

试试这种方式:

bbsl(Bin,Shift) -> <<_:Shift,Rest/bits>> = Bin, <<Rest/bits,0:Shift>>.
于 2008-12-29T08:41:53.023 回答
0

使用 Erlang 的无界整数大小,我们可以做到这一点:

1> Bits = <<16#0FFFFFFF:(4*8)>>.
<<15,255,255,255>>

2> size(Bits).
4

3> Size=size(Bits)*8.
32

4> <<Num:Size>> = Bits.
<<15,255,255,255>>

5> Num.
268435455

6> Num2 = Num bsl 4.
4294967280

7> Bits2 = <<Num2:Size>>.
<<"ÿÿÿð">>

8> <<A:8,B:8,C:8,D:8>>=Bits2.
<<"ÿÿÿð">>

9> A.
255

10> D.
240

正如我们所料。

请注意,在我的解决方案中,我通过将 4 个“0”添加到存储在二进制文件中的初始字符串(16#0F ... 前 4 个位置为 0)来预测我需要多少班次(4)

如果我不得不转移到二进制容器的“边界”之外,我不确定我会如何处理它,我猜你只会用 2^Size-1 进行与。

于 2008-12-24T04:05:12.680 回答