我正在尝试解析Linyx sysfs中的CPU节点关联+缓存同级信息。
我可以获得一串位,例如:
0000111100001111
现在我需要一个函数,其中我有一个十进制数(例如4或5),我需要测试是否设置了第n位。因此,它会为true
返回4
,为false
返回5
。我可以通过多次移动1
来创建一个字符串,但我不确定语法,是否有更简单的方法?此外,对字符串的长度没有限制,所以我想避免使用十进制< - >二元转换。
答案 0 :(得分:5)
假设您在$str
中有字符串“0000111100001111”,如果您执行预先计算步骤:
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。
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
没有位向量的简单变量,但确保向量是更有效的处理方式。
sub is_bit_set
{
my $bitstring = shift;
my $bit = shift;
return int substr($bitstring, -$bit, 1);
}