двоичный формат, побитовые операции существуют? например. << 16 # 7F, 16 # FF >> BSL 1 - PullRequest
8 голосов
/ 24 декабря 2008

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

1&gt  127 bsl 1.
254

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

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

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

Например,

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

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

Ответы [ 2 ]

6 голосов
/ 29 декабря 2008

Попробуйте так:

bbsl(Bin,Shift) -> <<_:Shift,Rest/bits>> = Bin, <<Rest/bits,0:Shift>>.
0 голосов
/ 24 декабря 2008

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

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.

...