I have an attribute (32 bits-long), that each bit responsible to specific functionality. Perl script I'm writing should turn on 4th bit, but save previous definitions of other bits.
I use in my program:
Sub BitOperationOnAttr
{
my $a="";
MyGetFunc( $a);
$a |= 0x00000008;
MySetFunc( $a);
}
** MyGetFunc/ MySetFunc my own functions that know read/fix val开发者_如何转开发ue.
Questions:
if usage of
$a |= 0x00000008;
is right ?how extract hex value by Regular Expression from string I have : For example:
"Attribute: Somestring: value (8 long (0x8))"
Perl provides several ways for dealing with binary data:
- The bitwise operators
&
,|
, and~
. - The
pack
andunpack
functions. - The
vec
function.
Your scenario sounds like a set of packed flags. The bitwise operators are a good fit for this:
my $mask = 1 << 3; # 0x0008
$value |= $mask; # set bit
$value &= ~$mask; # clear bit
if ($value & $mask) # check bit
vec
is designed for use with bit vectors. (Each element has the same size, which must be a power of two.) It could work here as well:
vec($value, 3, 1) = 1; # set bit
vec($value, 3, 1) = 0; # clear bit
if (vec($value, 3, 1)) # check bit
pack
and unpack
are better suited for working with things like C structs or endianness.
- if usage of $a |= 0x00000008; is right ?
Yes, this is fine.
- how extract hex value by Regular Expression from string I have : For example:
"Attribute: Somestring: value (8 long (0x8))"
I'm assuming you have a string like the above, and want to use a regular expression to extract the "0x8". In that case, something like:
if ($string =~ m/0x([0-9a-fA-F]+)/) {
$value = hex($1);
} else {
# string didn't match
}
should work.
精彩评论