私が書くこの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コードとは何ですか?
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);
このように、あなたはバイトに一定の鋳造を避けるために、あなたは負のバイトで、上記の問題を回避します。