2016-07-12 33 views
2

我有2個4位數(X0X1X2X3和Y0Y1Y2Y3),我想合併它們,以便創建一個8位數字:如何將2個4位無符號數合併成C中的1個8位數

X0X1X2X3 
Y0Y1Y2Y3 => X0Y0X1Y1X2Y2X3Y3 

我知道如何將它們連接起來,以創建X0X1X1X3Y0Y1Y2Y3但我堅持就如何在模式上面說明撰寫他們。

任何提示?

+2

如何循環以每一位從兩個4位數字在每次迭代? –

+0

看看移位和邏輯或操作 –

+3

看到http://stackoverflow.com/questions/30539347/2d-morton-code-encode-decode-64bits – Bathsheba

回答

3

下面是執行這一轉變的一個相當直接的方式:

uint8_t result; 
result |= (x & 8) << 4; 
result |= (y & 8) << 3; 
result |= (x & 4) << 3; 
result |= (y & 4) << 2; 
result |= (x & 2) << 2; 
result |= (y & 2) << 1; 
result |= (x & 1) << 1; 
result |= (y & 1) << 0; 
3

一個非常快速的交織四位數字的方式是用查表:

unsigned int spread[] = { 
    0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15, 
    0x40, 0x41, 0x44, 0x45, 0x50, 0x51, 0x54, 0x55 
}; 

您可以使用spread[]陣列,其中「利差」原來的比特,來構建你的輸出如下:

unsigned int res = (spread[x] << 1) | spread[y]; 

訣竅在於構建查找表。其值的選擇方式是索引的位與零交錯。例如,0x07或0111 ,變爲0x15或00010101 。

+0

當然,這是可行的,只有當數量很小。如果你的位數太多,這個「傳播」​​數組可能太大而不值得。 –

+1

@NathanFellman具有256個條目的表格足以一次處理大多數一個字節的數字,而不是一次一個位。由於OP特別要求四位數字,所以對他來說不應該是個問題。 – dasblinkenlight

相關問題