Битовые операции, включая сдвиг разряда, фундаментальны для аппаратных средств низкого уровня или встроенного программирования. При чтении спецификации для устройства или даже некоторых форматов двоичного файла Вы будете видеть байты, слова, и 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;
Абсолютно не нужно экранировать точку с запятой в шаблоне регулярного выражения. В течение почти десяти лет, которые я использовал Perl, не было такой потребности, и я сомневаюсь, что когда-либо была.
Краткое изложение специальных символов и управляющих последовательностей можно найти в perldoc perlreref
.
Возможно, кто-то думает, что точку с запятой нужно экранировать, потому что выделение синтаксиса их редактора сбивается с толку встроенной точкой с запятой. По моему опыту, у большинства редакторов есть много проблем с синтаксисом Perl. Помните, Только perl может анализировать Perl .
Возможно, это привычка, выработанная из-за использования однострочных команд Perl в командной строке, а не использования кавычек, поэтому ';' разделить остальное на другую команду? В любом случае, как все говорят, в этом нет необходимости.
Да , точка с запятой не является метасимволом, поэтому я думаю, что ее не нужно экранировать.