use strict; use warnings; doShift (2, 5); print "\n"; doShift (3, 6); print "\n"; sub doShift { my ($ones, $bits, $pattern, $limit) = @_; --$ones; $limit ||= $bits; $pattern ||= 0; for my $right ($ones .. $limit - 1) { if ($ones) { doShift ($ones, $bits, $pattern | (1 << $right), $right); } else { printf "%0*b\n", $bits, $pattern | (1 << $right); } } } #### 00011 00101 00110 01001 01010 01100 10001 10010 10100 11000 000111 001011 001101 001110 010011 010101 010110 011001 011010 011100 100011 100101 100110 101001 101010 101100 110001 110010 110100 111000