Perl中的位操作

时间:2011-01-12 14:50:02

标签: perl bit-manipulation

我有一个属性(32位长),每个位负责特定的功能。我写的Perl脚本应该打开第4位,但保存其他位的先前定义。

我在我的程序中使用:

Sub BitOperationOnAttr

{

my $a="";

MyGetFunc( $a);

$a |= 0x00000008;

MySetFunc( $a);

}

** MyGetFunc / MySetFunc我自己的函数知道读取/修复值。

问题:

  1. 如果使用$a |= 0x00000008;是对的吗?

  2. 如何通过正则表达式从字符串I中提取十六进制值:例如:

  3. “属性:Somestring:value(8 long(0x8))”

2 个答案:

答案 0 :(得分:23)

Perl提供了几种处理二进制数据的方法:

  • 按位运算符&|~
  • packunpack函数。
  • vec功能。

您的场景听起来像是一组打包的标志。按位运算符非常适合这个:

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

vec旨在用于位向量。 (每个元素具有相同的大小,必须是2的幂。)它也可以在这里工作:

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

packunpack更适合处理C结构或字节序等内容。

答案 1 :(得分:5)

  
      
  1. 如果使用$ a | = 0x00000008;是对吗?
  2.   

是的,这很好。

  
      
  1. 如何通过正则表达式从字符串I中提取十六进制值:例如:
  2.         

    “属性:Somestring:value(8 long(0x8))”

我假设您有一个类似上面的字符串,并希望使用正则表达式来提取“0x8”。在这种情况下,例如:

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

应该有用。