2012-01-14 43 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); 
}