0

ビットを uint の配列にパックすることで、ビット ベクトルを実装しています。このgetBit(index)関数は(array[cell] & (1 << bit)) >> bit、ビットが設定されているかどうかを取得するために a を実行します。これは、MSB を除くすべてのビットで完全に機能します。うまくいかない例は以下の通りです。

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

ビットごとの AND 演算が 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

符号なし整数の場合。

私は Action Script に詳しくありませんが、 が符号付き整数である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 に答える