我通过将位打包成一个uints数组来实现一个位向量。 getBit(index)
函数执行(array[cell] & (1 << bit)) >> bit
以获取是否已设置位。这对于除MSB之外的所有位都非常有效。它不起作用的一个例子如下。
array[cell] = 11111001 11100000 00000000 00000000
(1 << bit) = 10000000 00000000 00000000 00000000
& operation = 01111001 11100000 00000000 00000000
我无法弄清楚为什么Bitwise AND操作似乎像XOR一样运行。无论是那个还是MSB都没有设置。任何人都可以解释发生了什么?
编辑:实际代码
var cell:uint = int(index / 32);
var bit:uint = 32 - (index % 32) - 1;
return (array[cell] & (1 << bit)) >> bit;
在不起作用的实例中,index = 0
答案 0 :(得分:3)
如果所有值都是明确定义的,
(array[cell] & (1 << bit)) >> bit
相当于更简单的
(array[cell] >> bit) & 1
表示无符号整数。
我不熟悉Action Script,但可能1 << 31
表现得很奇怪,因为1
是有符号整数。
除了评论,
var bit:uint = 32 - (index % 32) - 1;
看起来很奇怪,通常会使用index % 32
作为位数。
答案 1 :(得分:1)
使用无符号移位。
(uint(array[cell]) & (uint(1) << bit)) >>> bit