从单个整数中提取一组值

时间:2013-08-22 17:16:43

标签: perl bitwise-operators subroutine

我有很多事情(让我们把它们称为节点......没关系),方便地称为node1,node2,... nodeN。

棘手的部分是我需要一个perl子例程,它接受一个引用一组节点的整数。我的方法是:

  1. 每个节点都有一个基于2的幂的值,如下所示:

    • node1 = 1
    • node2 = 2
    • node3 = 4
    • node4 = 8
    • ...
    • node8 = 128
  2. 将每个节点的值相加以生成整数。例如,节点1,3,4和7的结果为77的整数。

  3. 现在,我将如何创建一个采用类似整数的子程序并返回一个节点数组?


    PS:

    • 最大节点数量是可配置的。 16是合理的最大值
    • 如果我接近这种过于繁琐的方式,我愿意接受建议,以便更好地从单个值生成一组节点。

3 个答案:

答案 0 :(得分:5)

将$ max设置为节点数(例如16)。

sub nodes {
    my $num = shift;
    return grep { $num & 2 ** $_ } 1 .. $max - 1;
}

答案 1 :(得分:1)

假设有16个节点:

sub nodes {
    my ($num) = @_;
    grep {($num >> ($_ - 1)) & 1} 1..16;
}

答案 2 :(得分:1)

#!/usr/bin/env perl

use strict;
use warnings;

use Const::Fast;

const my @NODE_SET => (0 .. 31);
const my @NODE_NAMES => map "node$_", @NODE_SET;
const my @POWERS_OF_2 => map 2**$_, @NODE_SET;

my @examples = (
    0b10011100111001011001110011100101,
    0b00010100101001111001110011100101,
    0b11110001010001101001110011100101,
);

print "@$_\n" for map extract_nodes($_), @examples;

sub extract_nodes {
    my $encoded_node = shift;
    return [ @NODE_NAMES[
        grep $POWERS_OF_2[$_] & $encoded_node, @NODE_SET
        ]
    ];
}