Я должен выйти из точки с запятой в литерале регулярного выражения Perl?

Битовые операции, включая сдвиг разряда, фундаментальны для аппаратных средств низкого уровня или встроенного программирования. При чтении спецификации для устройства или даже некоторых форматов двоичного файла Вы будете видеть байты, слова, и dwords, разбитый в небайт, выровнял битовые поля, которые содержат различные значения интереса. Доступ к этим битовым полям для чтения/записи является наиболее распространенным использованием.

А простой реальный пример в графическом программировании - то, что 16-разрядный пиксель представлен следующим образом:

  bit | 15| 14| 13| 12| 11| 10| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1  | 0 |
      |       Blue        |         Green         |       Red          |

Для достигания зеленого значения Вы сделали бы это:

 #define GREEN_MASK  0x7E0
 #define GREEN_OFFSET  5

 // Read green
 uint16_t green = (pixel & GREEN_MASK) >> GREEN_OFFSET;

Объяснение

для получения значения зеленого цвета ТОЛЬКО, который запускается при смещении 5 и заканчивается в 10 (т.е. 6 битов длиной), необходимо использовать (разрядную) маску, которая, когда применено против всего 16-разрядного пикселя, приведет только к битам, которыми мы интересуемся.

#define GREEN_MASK  0x7E0

соответствующая маска является 0x7E0, который в двоичном файле равняется 0000011111100000 (который является 2016 в десятичном числе).

uint16_t green = (pixel & GREEN_MASK) ...;

Для применения маски Вы используете операцию И (&).

uint16_t green = (pixel & GREEN_MASK) >> GREEN_OFFSET;

После применения маски, Вы закончите с 16-разрядным числом, которое является действительно просто 11-разрядным числом, так как его MSB находится в 11-м бите. Зеленый на самом деле только 6 битов длиной, таким образом, мы должны масштабировать его вниз использование сдвига вправо (11 - 6 = 5), следовательно использование 5, как смещено (#define GREEN_OFFSET 5).

Также распространенный использует сдвиги разряда для быстрого умножения и разделения полномочиями 2:

 i <<= x;  // i *= 2^x;
 i >>= y;  // i /= 2^y;
10
задан Sinan Ünür 29 July 2009 в 14:37
поделиться

6 ответов

Абсолютно не нужно экранировать точку с запятой в шаблоне регулярного выражения. В течение почти десяти лет, которые я использовал Perl, не было такой потребности, и я сомневаюсь, что когда-либо была.

Краткое изложение специальных символов и управляющих последовательностей можно найти в perldoc perlreref .

]
14
ответ дан 3 December 2019 в 16:53
поделиться

Возможно, кто-то думает, что точку с запятой нужно экранировать, потому что выделение синтаксиса их редактора сбивается с толку встроенной точкой с запятой. По моему опыту, у большинства редакторов есть много проблем с синтаксисом Perl. Помните, Только perl может анализировать Perl .

5
ответ дан 3 December 2019 в 16:53
поделиться

Возможно, это привычка, выработанная из-за использования однострочных команд Perl в командной строке, а не использования кавычек, поэтому ';' разделить остальное на другую команду? В любом случае, как все говорят, в этом нет необходимости.

3
ответ дан 3 December 2019 в 16:53
поделиться

нет необходимости избегать этого.

1
ответ дан 3 December 2019 в 16:53
поделиться

Нет. /; / всегда должно работать нормально.

1
ответ дан 3 December 2019 в 16:53
поделиться

Да , точка с запятой не является метасимволом, поэтому я думаю, что ее не нужно экранировать.

0
ответ дан 3 December 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: