Perl:测试位串中的任意位

时间:2012-01-14 20:54:08

标签: perl

我正在尝试解析Linyx sysfs中的CPU节点关联+缓存同级信息。

我可以获得一串位,例如:

0000111100001111

现在我需要一个函数,其中我有一个十进制数(例如4或5),我需要测试是否设置了第n位。因此,它会为true返回4,为false返回5。我可以通过多次移动1来创建一个字符串,但我不确定语法,是否有更简单的方法?此外,对字符串的长度没有限制,所以我想避免使用十进制< - >二元转换。

3 个答案:

答案 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);
}