在ActionScript 3位运算比较的Java

nhoxbypass:

我研究的是写一本AS3码BitStringByteArray来源: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)

什么是这些AS3代码相当于在Java中?

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

话虽如此,你可能希望从一开始就整数工作,并转换为字节以后。

你的代码目前转录位串到比特流切成字节。

如果一个字节中的所有位都设置一个特殊情况的处理,在这种情况下,为0xFF00输出。

什么是UINT(1个<< bytepos)?

该移动运营商由LHS bytepos位向左:

1 << 4 -> 0b00010000

什么是如果条件如果(值UINT(1个<< posVal中))?我不知道是否与为“与”位运算符或“和”条件。

&是按位,&&是布尔值。

操作!= 0- > TRUE如果在比特posval位置被设置。这是设置相应的位在字节的条件。

代码转移到Java应该是简单的实际。我建议你使用纯intJava和转换为字节你写之前:

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

这样,你避免不断铸件字节和你避免消极字节上述问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章