Skip to main content

avr/
math.rs

1use std::{ops, convert};
2
3pub fn sign_extend<T>(value: T, bit_size: T) -> T
4    where T: Clone + ops::Sub<Output=T> + ops::Shl<T, Output=T> + ops::BitAnd<Output=T> + convert::From<i8> {
5    let one = T::from(1i8);
6
7    let sign_bit = one.clone() << (bit_size - one.clone());
8    (value.clone() & (sign_bit.clone() - one.clone())) - (value & sign_bit)
9}
10