ActionScriptの3のビット単位の操作は、Javaとの比較します

nhoxbypass:

私が書くこのAS3コード研究していますBitStringにをByteArray出典:JPGEncoder#writeBits()

private var byteout:ByteArray;
private var bytenew:int = 0;
private var bytepos:int = 7;

private function writeBits(bs:BitString):void
{
    var value:int = bs.val;
    var posval:int = bs.len-1;
    while (posval >= 0) {
        if (value & uint(1 << posval)) {
            bytenew |= uint(1 << bytepos);
        }
        posval--;
        bytepos--;
        if (bytepos < 0) {
            if (bytenew == 0xFF) {
                writeByte(0xFF);
                writeByte(0);
            } else {
                writeByte(bytenew);
            }
            bytepos=7;
            bytenew=0;
        }
    }
}

しかし、私は、コードの一部を理解していません。

  • 何ですかuint(1 << bytepos)
  • もし条件は何ですかif (value & uint(1 << posval))
    • 私はかどうかわからない&「と」ビット演算子、または「と」の状態です。
    • if(number)AS3手段にif(number != 0)

Javaで同等のこれらのAS3コードとは何ですか?

THST:

Javaは何の符号なしの型を持っていないため、Javaのビット演算は、ややぎこちないです。あなたがバイトを仕事にしようとするときだから、あなたは必ずバイトと一緒にする必要があります。0x0Fのようなもの| 0x80 - > 0b1000 1111バイトで行われ、すべての時間バイトにキャストする必要があります。

System.out.printf("%x - %x - (byte)%x - (int)%x\n", 
                   (byte)0x80, 
                   (byte)0xf, 
                   (byte)((byte)0x80|(byte)0xf), 
                    (int)((byte)0x80|(byte)0xf));

OUTPUT:
80 - f - (byte)8f - (int)ffffff8f

これを言って、あなたは最初からint型で動作するようにしたいと後でバイトに唱えてもよいです。

バイトにビットストリームカットへのコードは現在転写するビット列を。

バイトのすべてのビットが出力さは0xFF00その場合には、設定されている場合、特殊なケースが処理されます。

UINT(1 << bytepos)とは何ですか?

この移動により、オペレータのLHS bytepos左側ビット:

1 << 4 -> 0b00010000

(値&UINT(1 << posval))場合であれば条件は何ですか?私は&であるかどうか「と」ビット演算子、または「と」の状態を知りません。

&ビット単位でAND、&&ブール値です。

動作は、!= 0> - TRUEのビット場合にposval位置が設定されています。これは、バイトに対応するビットを設定するための条件です。

Javaへのコードを転送すると、実際に簡単です。私はあなたが、プレーン使うことをお勧めintあなたが書く直前にバイトに、Javaと変換に:

byte realByte = (byte)(intbyte & (byte)0xff);
writeByte(realByte);

このように、あなたはバイトに一定の鋳造を避けるために、あなたは負のバイトで、上記の問題を回避します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=227632&siteId=1