我正在研究编写 BitString
的 AS3 代码进入 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 条件是什么
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,然后再转换为 bytes。
您提供的代码将 BitString 转录为切成字节的比特流。
如果设置了字节的所有位,则处理特殊情况,在这种情况下输出 0xff00。
What is uint(1 << bytepos)?
这会将运算符的 lhs 向左移动 bytepos
位:
1 << 4 -> 0b00010000
What is the if condition if (value & uint(1 << posval))? I don't know whether the & is "and" bit operator, or "and" condition.
&
是按位与,&&
是 boolean 值。
如果 posval
位置的位被设置,操作是 != 0
-> TRUE
。这是设置字节中相应位的条件。
将代码转移到 Java 实际上应该很简单。我建议您在 java 中使用纯 int
并在您编写之前转换为字节:
byte realByte = (byte)(intbyte & (byte)0xff);
writeByte(realByte);
这样,您就可以避免不断地转换为 byte,也可以避免上面提到的负字节问题。
关于java - ActionScript 3 中的按位运算与 Java 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56732832/