pub fn create_end_mask(end_bit: u64) -> u64 {
(!0u64) >> (64 - end_bit)
}
pub fn create_end_mask32(end_bit: u32) -> u32 {
(!0u32) >> (32 - end_bit)
}
pub fn get_bits_value(value: u64, shift: u64, len: u64) -> u64 {
(value >> shift) & create_end_mask(len)
}
pub fn set_bits_value(value: u64, shift: u64, len: u64, new_value: u64) -> u64 {
let new_value = new_value & create_end_mask(len);
let mask = ((1u64 << len) - 1) << shift;
let cleared_value = value & !mask;
let shifted_new_value = new_value << shift;
cleared_value | shifted_new_value
}
pub fn set_bits_value32(value: u32, shift: u32, len: u32, new_value: u32) -> u32 {
let new_value = new_value & create_end_mask32(len);
let mask = ((1u32 << len) - 1) << shift;
let cleared_value = value & !mask;
let shifted_new_value = new_value << shift;
cleared_value | shifted_new_value
}