ActionScript 3中的按位运算与Java比较

时间:2019-06-24 08:41:43

标签: java actionscript-3 actionscript

我正在研究将此BitString写入ByteArray的AS3代码。来源: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))是什么?
    • 我不知道&是“ and”位运算符还是“ and”条件。
    • AS3中的if(number)意味着if(number != 0)吗?

这些AS3代码在Java中等效于什么?

2 个答案:

答案 0 :(得分:3)

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,然后再转换为字节。

您提供的代码将BitString转换为切成字节的比特流。

如果设置了字节的所有位,则处理特殊情况,在这种情况下,输出0xff00。

  

什么是uint(1 << bytepos)?

这会将运算符的lhs向左移动bytepos位:

1 << 4 -> 0b00010000
  

if条件if(value&uint(1 << posval))是什么?   我不知道&是“ and”位运算符还是“ and”条件。

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

如果已设置!= 0位置的位,则操作为TRUE-> posval。这是设置字节中相应位的条件。

实际上,将代码传输到Java应该很简单。我建议您在Java中使用普通的int并在编写之前将其转换为字节:

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

这样,您可以避免将常量强制转换为字节,并且可以避免上述负字节问题。

答案 1 :(得分:2)

我认为这些是AS3的移位运算符。您会发现Java使用相同的语法。

关于link的AS3中的位操作。 Java文档页面here解释了操作员的工作。

对于if条件,它检查 value 中从右起第'posval'位是否为1。它通过按按位和“选择”该位。在 value 和value 1(二进制值000 ... 01)之间以 posval 位的移位。