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