my $firstbit = ($longsize * 8) - 1;
my $firstbit_mask = 1 << $firstbit;
####
use constant NUM_BITS = $Config{ivsize} * 8;
use constant SIGN_BIT = 1 << ( NUM_BITS - 1 );
use constant ALL_BITS = -1;
sub sr_signed {
my ($p, $q) = @_;
if ($p & SIGN_BIT) {
return ($p >> $q) | ($ALL_BITS << (NUM_BITS - $q));
} else {
return $p >> $q;
}
}
####
Shift 10101111...10101100 by 3
10101111...10101100 >> 3
|||||||| |||||
\\\\\\\\ \\\\\
\\\\\\\\ \\\\\
|||||||| |||||
00010101111...10101
11111111...11111111 << (NUM_BITS-3)
|||
_____________///
///
|||
11100000...00000000
00010101111...10101
| 11100000...00000000
-------------------
11110101111...10101