【问题标题】:Bitwise operation in ActionScript 3 compare to JavaActionScript 3 中的按位运算与 Java 的比较
【发布时间】:2019-11-06 00:57:31
【问题描述】:

我正在研究这个将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 &lt;&lt; bytepos)
  • if 条件if (value &amp; uint(1 &lt;&lt; posval)) 是什么?
    • 我不知道&amp;是“and”位运算符,还是“and”条件。
    • AS3 中的if(number) 是指if(number != 0) 吗?

这些 AS3 代码在 Java 中的等价物是什么?

【问题讨论】:

    标签: java actionscript-3 actionscript


    【解决方案1】:

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

    这个link 关于AS3 中的位操作。 Java 文档页面here 解释了运算符的作用。

    至于 if 条件,它检查 value 中右起第 'posval' 位是否为 1。它通过应用 按位和value 和值 1(二进制 000...01)之间移动 posval 位。

    【讨论】:

      【解决方案2】:

      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
      

      话虽如此,您可能希望从一开始就使用整数,然后再转换为字节。

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

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

      什么是uint(1

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

      1 << 4 -> 0b00010000
      

      if (value & uint(1

      &amp; 是按位与,&amp;&amp; 是布尔值。

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

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

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

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

      【讨论】:

      • Java没有unsigedint,所以我需要申请类型转换uint()吗?或者只是在普通 int 中做所有事情,然后使用 (byte)(intbyte &amp; (byte)0xff) 写入字节?
      • 代码只使用低 8 位,忽略 uint 的东西,只使用 java int 并如前所述使用 writeByte() 和显式转换的字节。
      • 那么Java中的if条件是if ((value &amp; (1 &lt;&lt; posval)) != 0)?
      • 是的,可以的。
      • uint() 可防止 AS3 中的运行时错误。您可以在以下位置查看示例:help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
      猜你喜欢
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多