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'.