двоичный формат, битовые операции существуют? напр.. bsl 1
В erlang существуют побитовые операции для работы с целыми числами, например:
1> 127 bsl 1.
254
Существует также возможность упаковывать целые числа в последовательность байтов
<< 16#7F, 16#FF >>
Возможно ли, или существуют ли какие-либо операторы или бифы, которые могут выполнять побитовые операции (например, и, или, XOR, SHL, SHR) над двоичными упакованными данными?
Например (если bsl работал с бинарными пакетами - чего он не делает):
1> << 16#7F, 16#FF >> bsl 1.
<< 255, 254 >>
2 ответа:
Используя неограниченные целочисленные размеры Эрланга, мы можем сделать следующее:
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.