我正在尝试为游戏制作逻辑(在Flash中)。在一个部分中,给出以下行:
_ _ * _ _ __ *
我需要查找*
之间的所有空格是否为空(行中可能出现*以外的非空值)。 此操作经常进行
我想知道我是否可以使用行的位表示来实现这一点,而不是循环并检查中间位置。
对于代表_ _ * _ _ _ *
(xx1xxx1
= 1或0)的行x
,我可以将其与0001110
进行对比,以便答案为{{1} },中间位置是空的。
这里的问题当然是如何使用位操作(在Flash AS2中)找到第二个映射(上面0000000
)? (图(1,4) - > 0110,(1,3) - > 0100等)
或者循环通过中间位置只是更好的选择?
答案 0 :(得分: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
是一系列的右边的零的数量。