Perl中的位操作

Perl中的位操作,perl,bit-manipulation,Perl,Bit Manipulation,我有一个属性(32位长),每个位负责特定的功能。我正在编写的Perl脚本应该启用第4位,但保存以前对其他位的定义 我在我的程序中使用: Sub BitOperationOnAttr { my $a=""; MyGetFunc( $a); $a |= 0x00000008; MySetFunc( $a); } **MyGetFunc/MySetFunc我自己的函数,它们知道读取/修复值 问题: 如果使用$a |=0x00000008对吗 如何通过正则表达式从我拥有的字符串中提取十六进

我有一个属性(32位长),每个位负责特定的功能。我正在编写的Perl脚本应该启用第4位,但保存以前对其他位的定义

我在我的程序中使用:

Sub BitOperationOnAttr

{

my $a="";

MyGetFunc( $a);

$a |= 0x00000008;

MySetFunc( $a);

}
**MyGetFunc/MySetFunc我自己的函数,它们知道读取/修复值

问题:

  • 如果使用
    $a |=0x00000008对吗

  • 如何通过正则表达式从我拥有的字符串中提取十六进制值:例如:

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

  • 如果使用$a |=0x00000008;是吗
  • 是的,这很好

  • 如何通过正则表达式从我拥有的字符串中提取十六进制值:例如:
  • “属性:Somestring:value(8长(0x8))”

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

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

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

    • 按位运算符
      &
      |
      ~
    • pack
      unpack
      功能
    • vec
      功能
    您的场景听起来像一组打包的标志。按位运算符非常适合这种情况:

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

    pack
    unpack
    更适合处理C结构或endianness之类的问题。

    您的问题不相关;它们应该分开张贴。这使得其他有类似问题的人更容易找到他们。谢谢你的快速回答。您向我展示了解决问题的正确方法我投了赞成票,但缺少了一些非常重要的东西:
    vec
    对字符串进行操作!如果我们使用数字;说:
    $val=5;printf(“b%08b”,$val)
    (这给出了
    b00000101
    )--然后可以看到“校验位”语法,比如:
    for($ix=7;$ix>=0;$ix-){print vec($val,$ix,1);};打印“\n”
    将不起作用(它给出的
    00110101
    ,不是相同的数字)。正确的方法是将数字转换为ASCII字符,即
    print vec(sprintf(“%c”,$val),$ix,1)
    vec($value, 3, 1) = 1;  # set bit
    vec($value, 3, 1) = 0;  # clear bit
    if (vec($value, 3, 1))  # check bit