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