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