我试图解析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