#ifndef morpheo_BitManipulation #define morpheo_BitManipulation /* * $Id$ * * [ Description ] * */ #include #include using namespace std; namespace morpheo { // gen_mask .................................................................. template T gen_mask (uint32_t size) { T mask = 0; for (uint32_t i=0; i T mask (uint32_t data, uint32_t index_max, uint32_t index_min) { return (gen_mask(index_max-index_min+1)< T mask_not (uint32_t data, uint32_t index_max, uint32_t index_min) { return (~(gen_mask(index_max-index_min+1)< T shift_logic_left (uint32_t size, uint32_t data, uint32_t value) { T mask = gen_mask (size); return (mask & ((mask & data) << value)); } template T shift_logic_right (uint32_t size, uint32_t data, uint32_t value) { T mask = gen_mask (size); return (mask & ((mask & data) >> value)); } // shift_logic ............................................................... template T shift_logic (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left) { if (is_direction_left == true) return shift_logic_left (size, data, value); else return shift_logic_right (size, data, value); } // shift_left_arithmetic, shift_right_arithmetic ............................. template T shift_arithmetic_left (uint32_t size, uint32_t data, uint32_t value) { bool carry = (data&1) != 0; if (carry == false) return shift_logic_left (size,data,value); else { if (value > size) return gen_mask (size); T mask = gen_mask (value); return shift_logic_left (size,data,value) | mask; } } template T shift_arithmetic_right (uint32_t size, uint32_t data, uint32_t value) { bool carry = (data&(1<<(size-1))) != 0; if (carry == false) return shift_logic_right (size,data,value); else { if (value > size) return gen_mask (size); T mask = gen_mask (value) << (size-value); return ((shift_logic_right (size,data,value)) | mask); } } // shift_arithmetic .......................................................... template T shift_arithmetic (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left) { if (is_direction_left == true) return shift_arithmetic_left (size, data, value); else return shift_arithmetic_right (size, data, value); } // shift ..................................................................... template T shift (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left, bool is_shift_arithmetic) { if (is_shift_arithmetic == true) return shift_arithmetic (size, data, value, is_direction_left); else return shift_logic (size, data, value, is_direction_left); } // rotate_left, rotate_right ................................................. template T rotate_left (uint32_t size, uint32_t data, uint32_t value) { T mask = gen_mask (size); T rotate_mask = gen_mask (value); T rotate = rotate_mask & shift_logic_right(size,data,size-value); return (mask & (shift_logic_left (size, data, value) | rotate)); } template T rotate_right (uint32_t size, uint32_t data, uint32_t value) { T mask = gen_mask (size); T rotate_mask = gen_mask (value); T rotate = shift_logic_left (size,rotate_mask & data,size-value); return (mask & (shift_logic_right (size, data, value) | rotate)); } // rotate .................................................................... template T rotate (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left) { if (is_direction_left == true) return rotate_left (size, data, value); else return rotate_right (size, data, value); } // range ..................................................................... template T range (uint32_t data, uint32_t index_max, uint32_t index_min) { return gen_mask(index_max-index_min+1) & (data << index_min); } template T range (uint32_t data, uint32_t nb_bits) { return gen_mask(nb_bits) & data; } }; // end namespace morpheo #endif