2017-01-20 6 views
0

У меня есть три значения: uint8_t, uint16_t и uint8_t в этом порядке. Я пытаюсь объединить их с одним uint_32, не теряя приказ. Я нашел this вопрос отсюда, но я застрял с значением uint_16 в середине.Объединение uint8_t, uint16_t и uint8_t

Например:

uint8_t v1=0x01; 
uint16_t v2=0x1001; 
uint8_t v3=0x11; 

uint32_t comb = 0x01100111; 

Я думал о том, выплевывая v2 на два отдельных uint8_t: ■ но понял, что может быть какой-то более простой способ решить эту проблему.

Моя попытка:

v2 = 0x1001; 
a = v2 & 0xFF; 
b = v1 >> 8; 
first = ((uint16_t)v1 << 8) | a; 
end = ((uint16_t)b << 8) | v3; 

comb = ((uint32_t)first << 16) | end; 
+1

Есть операции смены, есть memcpy, и есть место размещения новое, чтобы назвать несколько –

ответ

2

Это должно быть вашим с вложением подразумевается и, как один-лайнер письменной трансформации:

uint32_t comb = ((uint32_t)v1 << 24) | (((uint32_t)v2 << 8) | v3); 

В принципе, у вас есть 8 | 16 | 8, строя тип 32-битного размера. Чтобы перенести первый и поставить в голову, вам нужно будет отбросить до 32 бит и использовать 24 (32-8). Затем ИЛИ следующих в процессе сдвига, то есть размещения на правом смещении, а остальные заполняются нулями и литьем соответственно.

Вы используете ИЛИ по очевидным причинам, не теряя при этом никакой информации.

+1

Неплохо, спасибо. Я добавил свое решение на вопрос, но это так визуально лучше, чем мой грязный! – Duzzz

 Смежные вопросы

  • Нет связанных вопросов^_^