2013-08-22 33 views
0

我有一些事情提取一组值(我们姑且称之为节点......没关系),方便地称为节点1,节点2,...节点N。从一个整数

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

  1. 每个节点被赋予根据2的幂的值,这样的:

    • 节点1 = 1
    • 节点2 = 2
    • 节点3 = 4
    • node4 = 8
    • ...
    • node8 = 128
    • etc
  2. 将每个节点的值加起来以产生一个整数。例如,节点1,3,4和7的结果中作为77.

现在整数,我将如何去建立一个子程序,它需要一个整数像,并返回节点编号的数组?


PS:

  • 节点的最大数量是可配置的。 16是一个合理的最大值。
  • 如果我处理这个过于麻烦的方式,我愿意从单一值时产生一组节点的一个更好的办法的建议。
+1

吃惊使用http://p3rl.org/vec或http://p3rl.org/unpack – ysth

回答

5

设置$ max与节点的数量(例如16)。

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

工程就像一个魅力,看看没有答案!唯一的问题是,这需要第一个节点的值为2而不是1,但这根本不是问题。干杯! – Jarmund

+0

您可以将它更改为'($ _ - 1)'从1开始工作。另外注意到我将0更改为1,因为0不能用'&'返回1。 – choroba

1

假设16个节点:

sub nodes { 
    my ($num) = @_; 
    grep {($num >> ($_ - 1)) & 1} 1..16; 
} 
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 
     ] 
    ]; 
}