my @n = (-25, 14, 50, 20, -7, -8, -10); my $max = 2**@n; for (my $i = 0; $i < $max; ++$i) { my $sum = 0; $sum += $n[$_] for grep $i & 2**$_, 0 .. $#n; if ($sum == 0) { my ($bits, @used) = $i; while ($bits) { my $high_bit = int(log($bits)/log(2)); push @used, $n[$high_bit]; $bits &= ~(2**$high_bit); } print "[@used] = 0\n"; } } #### my ($bits, $j, @used) = ($i, 0); while ($bits) { push @used, $n[$j] if $bits & 1; $bits >>= 1, ++$j; } #### for ( my ($bits, $j, @used) = ($i, 0); $bits; $bits >>= 1, ++$j ) { push @used, $n[$j] if $bits & 1; }