在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 >>
试试这种方式:
bbsl(Bin,Shift) -> <<_:Shift,Rest/bits>> = Bin, <<Rest/bits,0:Shift>>.
使用 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 进行与。