Perl:测试位串中的任意位

twb*_*mer -1 perl

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

我可以得到一串比特,例如:

0000111100001111

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

hob*_*bbs 5

假设你有一个比特字符串"0000111100001111" $str,如果你做预先计算步骤:

my $bit_vector = pack "b*", $str;
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用vec:

$is_set = vec $bit_vector, $offset, 1;
Run Code Online (Sandbox Code Playgroud)

例如,这段代码

for (0..15) {
  print "$_\n" if vec $bit_vector, $_, 1;
}
Run Code Online (Sandbox Code Playgroud)

将输出

4
5
6
7
12
13
14
15
Run Code Online (Sandbox Code Playgroud)

请注意,偏移量是从零开始的,因此如果您希望第一个位为第1位,则需要自己添加/减去1.