我有一个属性(32 位长),每个位负责特定的功能。我正在编写的 Perl 脚本应该打开第 4 位,但保存其他位的先前定义。
我在我的程序中使用:
Sub BitOperationOnAttr
{
my $a="";
MyGetFunc( $a);
$a |= 0x00000008;
MySetFunc( $a);
}
** MyGetFunc/MySetFunc 我自己的知道读取/修复值的函数。
问题:
$a |= 0x00000008;
是对的 ? “属性:Somestring:值(8长(0x8))”
最佳答案
Perl 提供了几种处理二进制数据的方法:
&
, |
, 和 ~
. pack
和 unpack
职能。 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
pack
和 unpack
更适合处理像 C 结构或字节序这样的东西。
关于perl - Perl 中的位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4670109/