У меня есть код, который вставляет параметры различной длины (u8, u16, u32) в u64 с оператором сдвига влево.
Затем в разных местах кода мне нужно вернуть исходные параметры из этого большого раздутого параметра.
Просто интересно, как в коде мы должны гарантировать, что это логическое смещение вправо, а не арифметика, при возврате исходных параметров.
Итак, вопрос в том, существуют ли какие-либо #defs или другие способы гарантировать и проверять, не испортится ли компилятор?
Вот код C ++:
u32 x , y ,z;
u64 uniqID = 0;
u64 uniqID = (s64) x << 54 |
(s64) y << 52 |
(s64) z << 32 |
uniqID; // the original uniqID value.
и позже при получении значений обратно:
z= (u32) ((uniqID >> 32 ) & (0x0FFFFF)); //20 bits
y= (u32) ((uniqID >> (52 ) & 0x03)); //2 bits
x= (u32) ((uniqID >> (54) & 0x03F)); //6 bits