在as3中,针对字节的低级操作可以通过ByteArray对象进行。ByteArray的最小存储对象是单个字节,8个位,最大正整数位256。ByteArray没有提精确到位的操作,位的状态只有两种0或者1,但是占用空间小,因此在很多情况下可以利用这种优势。
下面这个类就实现了精确到位的操作:
package components.utils
{
import flash.utils.ByteArray;
public class BitArray extends ByteArray
{
public function BitArray()
{
}
public function setBit(index:uint):void
{
this[index>>3] |= ( 1 << (index & 0x7));
}
public function unsetBit(index:uint):void
{
this[index >> 3] &= 0xFF ^ (1 << (index & 0x7));
}
public function getBit(index:uint):Boolean
{
return ((this[index >> 3] & (1 << (index & 0x7))) != 0);
}
}
}
它继承自ByteArray,当然我们完全可以用复合而非继承。对ByteArray我们可以设想成每个字节/每8个位之间有一个界限,但这些界限在BitArray中被我们抹去,一个BitArray对象就是连续的位数据。
index >> 3
上面这行代码是将位的位置定位到字节位置,而下面这行代码是取index的低八位,取出来的结果就是位在字节中的位置:
index & 0x7
然后用这个结果,将1左移这个结果的值的位数,并同字节数组中原字节数据进行|=(或等于)操作,这样就将index位置的位数据置为1了。