2008-12-24 15 views
8

En Erlang, il y a des opérations d'opérer sur les bits entiers, par exemple:le format binaire, les opérations au niveau du bit existent? par exemple. << 16 # 7F, 16 # FF >> bsl 1

1> 127 bsl 1. 
254 

il y a aussi la possibilité d'emballer des entiers dans une séquence d'octets

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

est-il possible, ou sont-il des opérateurs ou BIFs qui peuvent effectuer des opérations au niveau du bit (par exemple AND, OR, XOR, SHL, SHR) sur des données binaires emballés?

par exemple (si bsl a travaillé sur les paquets binaires - ce qui ne fonctionne pas):

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

Répondre

6

Essayez de cette façon:

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

Merci, ce qui est grand! En outre, ceci peut également être modifié pour la rotation: brol (Bin, Shift) -><< U: Shift, Rest/bits >> = Bin, << Rest/bits, U: Shift >> À la vôtre –

0

Utiliser la taille des entiers sans bornes de Erlang, nous pouvons y parvenir:

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 

que nous nous attendions.

Notez que dans ma solution que je prévoyais combien de changements je besoin (4) en ajoutant 4 « 0 de la chaîne initiale stockée dans le fichier binaire (16 # 0F ... les 4 premières positions sont 0)

Je ne sais pas comment je le ferais si je devais passer au-delà de la «limite» du conteneur binaire, je suppose que vous le feriez juste avec ET 2^Taille-1.