perl - Perl 中的位操作

标签 perl bit-manipulation

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

我在我的程序中使用:

Sub BitOperationOnAttr

{

my $a="";

MyGetFunc( $a);

$a |= 0x00000008;

MySetFunc( $a);

}

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

问题:
  • 如果使用 $a |= 0x00000008;是对的 ?
  • 如何通过正则表达式从字符串中提取十六进制值:例如:

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

    最佳答案

    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 结构或字节序这样的东西。

    关于perl - Perl 中的位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4670109/

    相关文章:

    perl - 在一行 Perl 中执行多个 +=

    perl - 一段时间后perl IO::Select处理问题

    perl - 使用 WWW::Mechanize 保存 PDF 文件会损坏它们

    perl - 如何在 Perl 哈希中表示文件系统的符号链接(symbolic link)?

    c - unsigned char 超过 255

    opengl - 精确控制GLSL中的纹理位

    c++ - 使用按位运算进行洪水填充

    linux - 为什么允许修改argv[0]?

    c - 按位与的结果似乎为 0,但实际上不是

    C# 对 ushort (UInt16) 进行位移