use strict; use warnings; use feature qw{say}; my $base = 128; say q{Non-packed base - }, unpack q{B*}, $base; say q{}; $base = pack q{C}, 128; say q{Packed base - }, unpack q{B*}, $base; my $three = pack q{C}, 3; say q{Three for or - }, unpack q{B*}, $three; $base |= $three; say q{Base now - }, unpack q{B*}, $base; say q{}; $base = pack q{C}, 138; say q{Revised base 138 - }, unpack q{B*}, $base; flipBits( \ $base, 0 .. 2 ); say q{Flipped base 141 - }, unpack q{B*}, $base; say q{}; unsetBits( \ $base, 0 .. 7 ); say q{Cleared base - }, unpack q{B*}, $base; say q{}; setBits( \ $base, 7 ); say q{Set high bit - }, unpack q{B*}, $base; say q{}; setBits( \ $base, 0, 1 ); say q{Set two lowest - }, unpack q{B*}, $base; say q{}; flipBits( \ $base, 0 .. 3 ); say q{Flip four lowest - }, unpack q{B*}, $base; say q{}; setBits( \ $base, 0 .. 2 ); say q{Set three lowest - }, unpack q{B*}, $base; say q{}; sub flipBits { my( $rsByte, @bits ) = @_; my $vec; vec( $vec, $_, 1 ) = 1 for @bits; say q{Flip mask - }, unpack q{B*}, $vec; ${ $rsByte } = ${ $rsByte } ^ $vec; } sub setBits { my( $rsByte, @bits ) = @_; my $vec; vec( $vec, $_, 1 ) = 1 for @bits; say q{Set mask - }, unpack q{B*}, $vec; ${ $rsByte } = ${ $rsByte } | $vec; } sub unsetBits { my( $rsByte, @bits ) = @_; my $vec; vec( $vec, $_, 1 ) = 1 for @bits; say q{Unset mask - }, unpack q{B*}, $vec; ${ $rsByte } = ${ $rsByte } & ( ~ $vec ); } #### Non-packed base - 001100010011001000111000 Packed base - 10000000 Three for or - 00000011 Base now - 10000011 Revised base 138 - 10001010 Flip mask - 00000111 Flipped base 141 - 10001101 Unset mask - 11111111 Cleared base - 00000000 Set mask - 10000000 Set high bit - 10000000 Set mask - 00000011 Set two lowest - 10000011 Flip mask - 00001111 Flip four lowest - 10001100 Set mask - 00000111 Set three lowest - 10001111