2011-12-21 5 views
1

私はゲームのロジックを(フラッシュで)解こうとしています。番号の位置のビットマスクを見つける

_ _ * _ _ __ *

Iは*年代の間のすべてのスペースが空(*行で発生する可能性以外の非空の値)である場合を見つける必要がある:一部に、次の行を与え。 この操作はかなり頻繁に行われます
ループを繰り返して中間の位置を確認するのではなく、これを実現するために行のビット表現を使用できるかどうかは疑問でした。答えが0000000ある場合、中間位置が空になるよう0001110xx1xxx1x = 1または0)、Iができ、それとして表さ行_ _ * _ _ _ *について

ビット操作(Flash AS2)を使用して、この2番目のマップ(上記の0001110)を見つける方法は、ここでの質問です。 (マップ(1,4) - > 0110、(1,3) - > 0100など)
または中間の位置をループしている方が良いでしょうか?

+0

あなたが興味のあるビットを囲むビットの位置を知っていますか?または、それは001xxx1のように、左端と右端の1ですか? – Kapep

+0

はい、私はポジションを知っています。それは私がMap(1,4)、Map(1,3)などを意味するものです – eternalthinker

答えて

2

いくつかのビットをシフトすることでこれを行うことができます。私はゼロから始まる、右からカウントするつもりだ -

var bits:int = 0x7F; // 7 bits 
var mask:int = ((bits >> (bits - end)) << start) & bits; 

は、私はあなたが1から始まる、左からそれをやったように例では、それはそう、位置に数えるかどうかはわかりませんこれはもっと一般的ですね。従って、startの値は、最初の1(右から0から数えて)の位置であり、endは最も左の位置1です。

それは具体的にどのように機能するかの例:

// row:   xx1xxx1 
// desired mask: 0001110 
//    the sequence of ones in the mask starts at 1, ends at 3 

bits = 0x7F;  // 1111111 
mask = bits >> 4; // 0000111 
mask = mask << 1; // 0001110 

これを説明する別の方法:bits-(end+1)は左側にゼロの量であり、startは1のシーケンスの右側にゼロの量であります。

関連する問題