2012-01-14 42 views
-1

我试图解析Linyx sysfs中的CPU节点亲和力+缓存同级信息。Perl:测试位串中的任意位

我可以得到的比特串,只是举例:

0000111100001111

现在我需要的功能在那里我有一个十进制数(如4或5),我需要测试是否第n位是否设置。所以它会返回true4false5。我可以通过n次移动1来创建一个字符串,但我不确定语法,是否有更简单的方法?另外,字符串可以有多长时间没有限制,所以我想避免小数点< - >二进制转换。

回答

5

假设你有一个比特“0000111100001111”的字符串中$str,如果你做了预计算一步:

my $bit_vector = pack "b*", $str; 

然后你可以使用vec像这样:

$is_set = vec $bit_vector, $offset, 1; 

因此,例如,此代码

for (0..15) { 
    print "$_\n" if vec $bit_vector, $_, 1; 
} 

将输出

4 
5 
6 
7 
12 
13 
14 
15 

注意,偏移量是从零开始的,所以如果你想第一位是位1,你需要加/减1自己。

+0

这适用于我,谢谢 – twblamer 2012-01-14 21:29:53

0

嗯,这似乎工作,我不会为了提高效率:

sub is_bit_set 
{ 
     my $bitstring = shift; 
     my $bit = shift; 

     my $index = length($bitstring) - $bit - 1; 
     if (substr($bitstring, $index, 1) == "1") { 
       return 1; 
     } 
     else { 
       return 0; 
     } 
} 
0

简单的变型,而不位向量,但是可以肯定的载体将是应对更有效的方式。

sub is_bit_set 
{ 
     my $bitstring = shift; 
     my $bit = shift; 
     return int substr($bitstring, -$bit, 1); 
}