0

我通过将位打包到一个 uint 数组中来实现位向量。该getBit(index)函数执行 a(array[cell] & (1 << bit)) >> bit来获取某个位是否已设置。这对除 MSB 之外的所有位都非常有效。它不起作用的示例如下。

array[cell] = 11111001 11100000 00000000 00000000
(1 << bit)  = 10000000 00000000 00000000 00000000
& operation = 01111001 11100000 00000000 00000000

我无法弄清楚为什么按位与运算似乎像 XOR 一样运行。要么是那个,要么是 MSB 未设置。谁能解释发生了什么?

编辑:实际代码

var cell:uint = int(index / 32);
var bit:uint = 32 - (index % 32) - 1;
return (array[cell] & (1 << bit)) >> bit;

在不起作用的情况下,index = 0

4

2 回答 2

3

如果所有的价值观都是明确定义的,

(array[cell] & (1 << bit)) >> bit

相当于更简单的

(array[cell] >> bit) & 1

对于无符号整数。

我不熟悉动作脚本,但它的1 << 31行为可能很奇怪,因为1它是一个有符号整数。

撇开说法,

var bit:uint = 32 - (index % 32) - 1;

看起来很奇怪,通常会index % 32用作位数。

于 2013-06-06T12:39:12.157 回答
1

使用无符号移位。

(uint(array[cell]) & (uint(1) << bit)) >>> bit
于 2013-06-06T12:16:34.523 回答