sub bits_needed { my ( $unsigned, $resolution ) = @_; my $bits_needed = floor( log2( $unsigned ) ) + 1; $bits_needed += $resolution - $bits_needed % $resolution if defined $resolution; return $bits_needed; } #### sub log2 { my $n = shift; return log($n)/log(2); } #### use strict; use warnings; use Bit::Vector; use Text::Template; use v5.12; my $orig_hex = "6bf"; my ( $reverse, $details ) = hex_reverse_bitwise( $orig_hex, 12 ); print Text::Template->fill_this_in( do{ undef $/; }, HASH => $details, ); # Return bitwise reversed hex digits in scalar context. # In list context, return reversed hex digits plus a hashref # containing more detailed analysis. sub hex_reverse_bitwise { my ( $start, $bit_size ) = @_; my $orig_vec = Bit::Vector->new_Hex( $bit_size, $orig_hex ); my $rev_vec = Bit::Vector->new( $bit_size ); $rev_vec->Reverse( $orig_vec ); my $reversed = $rev_vec->to_Hex; return( $reversed, wantarray() ? { orig_hex => $orig_hex, orig_bits => $orig_vec->to_Bin, reversed_bits => $rev_vec->to_Bin, new_hex => $reversed, } : () ); } __DATA__ Given the hex digits '{lc $orig_hex}' with a bit representation of '{$orig_bits}', reversing the bits to '{$reversed_bits}' we get a hex representation of '{lc $new_hex}'. #### Given the hex digits '6bf' with a bit representation of '011010111111', reversing the bits to '111111010110' we get a hex representation of 'fd6'.