2008-12-24 9 views
8

, tamsayılar üzerinde çalışmak üzere bit seviyesinde işlemler, örneğin vardır: bayt dizisi içine tamsayılar paketi yeteneği deikili biçim, bit işlemleri var mı? Örneğin. << 16 # 7F, 16 # FF >> bsl 1 erlang olarak

1> 127 bsl 1. 
254 

var

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

, bu mümkün veya ikili paketlenmiş verilere bitsel işlemleri (örneğin AND, OR, XOR, SHL, SHR) gerçekleştirebilir herhangi operatörler ya BIFS vardır? (Bsl ikili paketlerin üzerinde çalıştı eğer - öyle ki değil) örneğin

: bunu yapabilecek Erlang'ı sınırsız tamsayı boyutlarını kullanma

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

cevap

6

bu şekilde deneyin:

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

Teşekkür, bu harika! Ek olarak bu, dönüş için de değiştirilebilir: brol (Bin, Shift) -><< U: Shift, Dinlenme/bitler >> = Bin, << Rest/bit, U: Shift >> Şerefe –

0

:

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 

beklediğimiz gibi. benim çözümde ben ikili depolanan ilk dizeye 4 '0 ekleyerek I (4) gerekir kaç vardiya beklenen o

Not

(16 # 0F ... ilk 4 pozisyonları 0 olan)

İkili kabın 'sınır' ötesine geçmek zorunda kalsaydım, nasıl yapacağımı bilmiyorum, sanırım 2^Size-1 ile AND yapacağız.

İlgili konular