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; } #### 0 1 2 3 4 5 6 7 8 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 0100000101000010010000110100010001000101010001100100011101001000010010010100101001001011 Total set bits - 31 Set bits to 70 - 23 Set bits to 71 - 23 Set bits to 72 - 24 Set bits to 73 - 24 Set bits to 74 - 25 Set bits to 75 - 25 Set bits to 76 - 25 Set bits to 77 - 26 Set bits to 78 - 26 Set bits to 79 - 27 Set bits to 80 - 27 Set bits to 81 - 27 Set bits to 82 - 28 Set bits to 83 - 28 Set bits to 84 - 28 Set bits to 85 - 29 Set bits to 86 - 29 Set bits to 87 - 30