8

erlang には、整数を操作するためのビット演算があります。たとえば、次のようになります。

1>  127 bsl 1.
254

整数を一連のバイトにパックする機能もあります

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

可能ですか、またはバイナリパックされたデータに対してビット単位の演算 (AND、OR、XOR、SHL、SHR など) を実行できる演算子または BIF はありますか?

例 (bsl がバイナリ パッケージで動作した場合、動作しません):

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

2 に答える 2

6

この方法を試してください:

bbsl(Bin,Shift) -> <<_:Shift,Rest/bits>> = Bin, <<Rest/bits,0:Shift>>.
于 2008-12-29T08:41:53.023 に答える
0

Erlang の無制限の整数サイズを使用すると、これを実現できます。

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 つの '0' を追加することによって、必要なシフト数 (4) を予想していたことに注意してください (16#0F ... 最初の 4 つの位置は 0 です)。

バイナリ コンテナーの「境界」を超えてシフトする必要がある場合、どのように処理するかはわかりません。2^Size-1 と AND するだけだと思います。

于 2008-12-24T04:05:12.680 に答える