use strict; use warnings; use 5.014; say join q{}, map { sprintf q{%-10s}, $_ } 0 .. 8; say qq{@{ [ join q{}, 0 .. 9 ] }} x 9; my $vec = pack q{C*}, map ord, q{A} .. q{K}; say unpack q{B*}, $vec; say qq{Total set bits - @{ [ unpack q{%32b*}, $vec ] }}; say qq{Set bits to $_ - @{ [ setBitsB4pos( \ $vec, $_ ) ] }} for 70 .. 87; sub setBitsB4pos { my( $rsVec, $pos ) = @_; my $wholeBytes = int $pos / 8; my $oddBits = $pos % 8; my $count = unpack q{%32b*}, substr ${ $rsVec }, 0, $wholeBytes; return $count unless $oddBits; my $mask = pack q{C*}, ( 0 ) x $wholeBytes, do { my $acc; $acc += 2 ** ( 8 - $_ ) for 1 .. $oddBits; $acc; }; $count += unpack q{%32b*}, substr( ${ $rsVec }, 0, $wholeBytes + 1 ) & $mask; return $count; }