2011-12-21 230 views
1

我正在尝试制定出游戏逻辑(在Flash中)。在一个部分,因为下面一行:查找位号码位置

_ _ * _ _ __ *

我需要找到如果一切*的之间的空间是空的(比该行中可能会出现*其他非空值)。 该操作相当频繁地完成
我想知道如果我可以使用位表示行来实现这一点,而不是循环和检查中间位置。

对于表示为xx1xxx1_ _ * _ _ _ *x = 1或0),I可以而且它与0001110使得如果答案是0000000,所述中间位置是空的。

这里的问题当然是,如何使用位操作(在Flash AS2中)找到第二个映射(上面的0001110)? (地图(1,4) - > 0110,(1,3) - > 0100等)
或者是循环中间位置只是更好的选择?

+0

不确定,但是你知道你感兴趣的位周围的位的位置吗?或者它是最左边和最右边的1,比如'001xxx1'? – Kapep 2011-12-21 13:08:15

+0

是的,我知道职位。这就是我所说的地图(1,4),地图(1,3)等 – eternalthinker 2011-12-27 19:09:37

回答

2

你可以通过移动一些位来做到这一点。

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

我不知道你怎么算的位置,在这个例子中好像你从左边做了,开始用一个 - 我打算从右边来算,从零开始,我猜这更常见。所以start的值是第一个1(从右边算起从零开始)和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零的量是那些序列的右零的数量。