Используя неограниченные целочисленные размеры Эрланга, мы можем достичь этого:
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.