2017-01-20 11 views
0

私はuint8_t,uint16_tuint8_tの順に3つの値を持っています。注文を失うことなく、1つを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; 

私は2つの別々のuint8_tにv2を吐き考えていた。■しかし、それを解決するためにいくつかの簡単な方法があるかもしれません実現。

私の試み:

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

これは暗黙のあなたのnestedlyなるとワンライナー書か変換などする必要があります

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

基本的に、あなたは8を持っています| 16 | 32bitサイズのビルド8。最初のものを移動して先頭に置くには、32ビットにキャストし、24(32-8)を使用する必要があります。次に、次のものをシフトしながら、すなわち、右のオフセットに置き、残りをゼロで充填し、それぞれキャスティングする。

情報を失わないという明白な理由から、ORを使用します。

+1

きちんとありがとうございます。私は質問に私のソリューションを追加しましたが、これは私の乱雑なものよりも視覚的に優れています! – Duzzz

関連する問題