Найти битовые маски для числовых позиций - PullRequest
1 голос
/ 21 декабря 2011

Я пытаюсь выработать логику для игры (во Flash).В одной части, учитывая следующую строку:

_ _ * _ _ __ *

Мне нужно выяснить, все ли пробелы между * пусты (непустые значения, отличные от *, могутпроисходят в ряд). Эта операция выполняется довольно часто .
Мне было интересно, смогу ли я использовать битовые представления строк для достижения этой цели вместо циклического прохождения и проверки промежуточных позиций.

Для строки _ _ * _ _ _ *, представленной как xx1xxx1 (x = 1 или 0), я мог бы И это сделать с помощью 0001110, так что если ответ 0000000, промежуточные позиции будут пустыми,

Вопрос здесь, конечно, в том, как найти эту вторую карту (0001110 выше), используя битовые операции (во Flash AS2)?(Карта (1,4) -> 0110, (1,3) -> 0100 и т. Д.)
Или циклическое прохождение промежуточных позиций является лучшим выбором?

1 Ответ

2 голосов
/ 30 декабря 2011

Вы можете сделать это, сдвинув некоторые биты.

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 - это количество нулей справа от последовательности единиц.

...