0

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

棘手的部分是我需要一个 perl 子例程,它采用一个整数来表示一组节点。我的方法是这样的:

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

    • 节点1 = 1
    • 节点2 = 2
    • 节点3 = 4
    • 节点4 = 8
    • ...
    • 节点8 = 128
    • ETC
  2. 每个节点的值相加以产生一个整数。例如,节点 1、3、4 和 7 的结果为整数 77。

现在,我将如何创建一个接受这样的整数并返回节点号数组的子例程?


PS:

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

3 回答 3

5

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

sub nodes {
    my $num = shift;
    return grep { $num & 2 ** $_ } 1 .. $max - 1;
}
于 2013-08-22T17:25:33.117 回答
1

假设有 16 个节点:

sub nodes {
    my ($num) = @_;
    grep {($num >> ($_ - 1)) & 1} 1..16;
}
于 2013-08-22T17:23:13.007 回答
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
        ]
    ];
}
于 2013-08-22T17:37:01.843 回答