Битовые операции в Perl - PullRequest
       1

Битовые операции в Perl

4 голосов
/ 12 января 2011

У меня есть атрибут (длиной 32 бита), который каждый бит отвечает за определенную функциональность.Perl-скрипт, который я пишу, должен включать 4-й бит, но сохранять предыдущие определения других битов.

Я использую в своей программе:

Sub BitOperationOnAttr

{

my $a="";

MyGetFunc( $a);

$a |= 0x00000008;

MySetFunc( $a);

}

** MyGetFunc / MySetFunc мои собственные функциизнать значение чтения / исправления.

Вопросы:

  1. , если использование $a |= 0x00000008; правильно?

  2. как извлечь шестнадцатеричное значение с помощью регулярного выражения из строкиУ меня есть: Например:

"Атрибут: Somestring: значение (8 long (0x8))"

Ответы [ 2 ]

23 голосов
/ 12 января 2011

Perl предоставляет несколько способов работы с двоичными данными:

  • Битовые операторы &, | и ~.
  • pack и *Функции 1010 *.
  • Функция vec.

Ваш сценарий звучит как набор упакованных флагов.Для этого хорошо подходят побитовые операторы:

my $mask = 1 << 3;   # 0x0008
$value |=  $mask;    # set bit
$value &= ~$mask;    # clear bit
if ($value & $mask)  # check bit

vec предназначен для использования с битовыми векторами.(Каждый элемент имеет одинаковый размер, который должен быть степенью двойки.) Он также может работать здесь:

vec($value, 3, 1) = 1;  # set bit
vec($value, 3, 1) = 0;  # clear bit
if (vec($value, 3, 1))  # check bit

pack и unpack лучше подходят для работы с такими вещами, как структуры Cили порядковый номер.

5 голосов
/ 12 января 2011
  1. , если используется $ a | = 0x00000008;Правильно?

Да, это нормально.

  1. как извлечь шестнадцатеричное значение с помощью регулярного выражения из строки, которую я имею: Например:

"Атрибут: Somestring: value (8 long (0x8))" *

Я предполагаю, что у вас есть строка, подобная приведенной выше, и вы хотите использовать регулярное выражение дляизвлечь "0x8".В этом случае что-то вроде:

if ($string =~ m/0x([0-9a-fA-F]+)/) {
    $value = hex($1);
} else {
    # string didn't match
}

должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...