my @bits = (0 .. $dim - 1); for (0 .. $dim - 1) { $bits[$_] += 2 * $dim if $v & (1 << $_); } $bits[$height] += $dim; my @bitmap = map $_ % $dim, sort { $b <=> $a } @bits; #### # we now know what row should go where, so build and return the mapped result my @invmap = sort { $bitmap[$a] <=> $bitmap[$b] } 0 .. $dim - 1; my @vmap = (0); for (0 .. $dim - 1) { my $mapped = 1 << $invmap[$_]; push @vmap, map $_ + $mapped, @vmap; } return ($bitmap[$height], [ @$args[ @vmap ] ]);