двоичный формат, битовые операции существуют? напр.. bsl 1


В erlang существуют побитовые операции для работы с целыми числами, например:

1&gt  127 bsl 1.
254

Существует также возможность упаковывать целые числа в последовательность байтов

&lt&lt 16#7F, 16#FF &gt&gt

Возможно ли, или существуют ли какие-либо операторы или бифы, которые могут выполнять побитовые операции (например, и, или, XOR, SHL, SHR) над двоичными упакованными данными?

Например (если bsl работал с бинарными пакетами - чего он не делает):

1&gt  &lt&lt 16#7F, 16#FF &gt&gt bsl 1.
&lt&lt 255, 254 &gt&gt
2 8

2 ответа:

Попробуйте этот способ:

bbsl(Bin,Shift) -> <<_:Shift,Rest/bits>> = Bin, <<Rest/bits,0:Shift>>.

Используя неограниченные целочисленные размеры Эрланга, мы можем сделать следующее:

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), добавив 4 '0 к исходной строке, хранящейся в двоичном файле (16#0F... первые 4 позиции - 0)

Не уверен, как бы я справился с этим, если бы мне пришлось перейти за "границу" двоичного контейнера, я думаю, что вы просто и с 2 ^ размером-1.