我試圖解析Linyx sysfs中的CPU節點親和力+緩存同級信息。Perl:測試位串中的任意位
我可以得到的比特串,只是舉例:
0000111100001111
現在我需要的功能在那裏我有一個十進制數(如4或5),我需要測試是否第n位是否設置。所以它會返回true
爲4
和false
爲5
。我可以通過n次移動1
來創建一個字符串,但我不確定語法,是否有更簡單的方法?另外,字符串可以有多長時間沒有限制,所以我想避免小數點< - >二進制轉換。
我試圖解析Linyx sysfs中的CPU節點親和力+緩存同級信息。Perl:測試位串中的任意位
我可以得到的比特串,只是舉例:
0000111100001111
現在我需要的功能在那裏我有一個十進制數(如4或5),我需要測試是否第n位是否設置。所以它會返回true
爲4
和false
爲5
。我可以通過n次移動1
來創建一個字符串,但我不確定語法,是否有更簡單的方法?另外,字符串可以有多長時間沒有限制,所以我想避免小數點< - >二進制轉換。
假設你有一個比特「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自己。
嗯,這似乎工作,我不會爲了提高效率:
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;
}
}
簡單的變型,而不位向量,但是可以肯定的載體將是應對更有效的方式。
sub is_bit_set
{
my $bitstring = shift;
my $bit = shift;
return int substr($bitstring, -$bit, 1);
}
這適用於我,謝謝 – twblamer 2012-01-14 21:29:53