2008-12-24 16 views
8

In erlang gibt es bitweise Operationen auf ganze Zahlen zu arbeiten, zum Beispiel:Binärformat, bitweise Operationen existieren? z.B. << 16 # 7F, 16 # FF >> bsl 1

1> 127 bsl 1. 
254 

gibt es auch die Möglichkeit, ganze Zahlen in eine Folge von Bytes zu packen

<< 16#7F, 16#FF >>

ist es möglich, oder gibt es Operatoren oder BIFs, die bitweise Operationen (zB AND, OR, XOR, SHL, SHR) auf binäre gepackten Daten durchführen können?

zum Beispiel (wenn bsl auf Binärpakete gearbeitet - was sie nicht tut):

1> << 16#7F, 16#FF >> bsl 1. 
<< 255, 254 >>

Antwort

6

auf diese Weise ausprobieren:

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

Danke, das ist großartig! Zusätzlich kann dies auch für die Rotation geändert werden: brol (Bin, Shift) -><< U: Shift, Rest/Bits >> = Bin, << Rest/Bits, U: Shift >> Prost –

0

Mit Erlang unbegrenzt integer Größen wir dies erreichen können:

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 

als wir erwartet hatten.

Beachten Sie, dass ich in meiner Lösung zu erwarten, wie viele Schichten ich brauchen würde (4) durch Zugabe von 4 ‚0'en in die Anfangs Zeichenfolge in dem binären gespeichert (16 # 0F ... die ersten vier Positionen sind 0)

Nicht sicher, wie ich damit umgehen würde, wenn ich über die 'Grenze' des binären Containers hinausgehen müsste, ich denke, Sie würden einfach UND mit 2^Size-1.

Verwandte Themen