1
 2
 3
 4
 5
 6
 7
 8
 9
10
use std::{ops, convert, mem};

pub fn sign_extend<T>(value: T, bit_size: T) -> T
    where T: Clone + ops::Sub<Output=T> + ops::Shl<T, Output=T> + ops::BitAnd<Output=T> + convert::From<i8> {
    let one = T::from(1i8);

    let sign_bit = one.clone() << (bit_size - one.clone());
    (value.clone() & (sign_bit.clone() - one.clone())) - (value & sign_bit)
}