按位AND在MSB上不起作用

时间:2013-06-06 12:03:16

标签: algorithm actionscript-3 bit-manipulation

我通过将位打包成一个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

2 个答案:

答案 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