2015-11-28 118 views
1

我有一個4x4整數矩陣(稱爲tb),我可以從一個int64_t位串(稱爲state)創建如下:將整數矩陣轉換爲位串?

for(int i = 0; i < 4; i++) { 
    for(int j = 0; j < 4; j++) { 
     ipos -= 1; 
     tb[i][j] = (state >> (4*_pos)) & 0xf); 
    } 
} 

一旦我開始一個矩陣,但是,我怎麼能其更改爲位串?我希望通過整數矩陣,得到元素,創建它的4位十六進制表示,然後將它移位(<<4)正確的次數和位或(|)位串與新的state位串,但我不知道如何做到這一點,或者如果這是最好的方法。想法?

回答

1

當然,只是做你到底是怎麼說的,這樣的事情(未測試)

for (int i = 0; i < 4; i++) { 
    for (int j = 0; j < 4; j++) { 
     pos--; 
     state |= (uint64_t)tb[i][j] << (4 * pos); 
    } 
} 

這有一個相當長的依賴關係鏈,這是不是很大,特別是如果你在HPC是。你可以把它分成幾部分,比如上半部分和下半部分,然後把它們結合起來。作爲一個獎勵,這意味着轉換操作32位而不是64位,這在某些平臺上可能會更快。

取決於tb類型可能還有其他招數,例如,如果每一個條目是一個字節,你可以用兩個uint64_t的別名,那麼你可以結合使用直線bitmanipulation條目(儘管它們是「顛倒「與最便利的訂單相比)。

例如,也許這樣的事情(未測試)(假定的順序是相反的,它也可以用同樣的順序進行)

uint64_t low, high; // inputs 
uint64_t even = 0x00FF00FF00FF00FFULL; 
uint64_t odd = ~even; 
low = (low & even) | ((low & odd) >> 4); 
high = (high & even) | ((high & odd) >> 4); 
even = 0x0000FFFF0000FFFFULL; 
odd = ~even; 
low = (low & even) | ((low & odd) >> 8); 
high = (high & even) | ((high & odd) >> 8); 
low = (low & 0xFFFF) | (low >> 16); 
high = (high & 0xFFFF) | (high >> 16); 
return low | (high << 32); 

如果允許特殊說明有一個更短方式,(未測試,並且再次反轉順序)

low = _pext_u64(low, 0x0F0F0F0F0F0F0F0FULL); 
high = _pext_u64(high, 0x0F0F0F0F0F0F0F0FULL); 
return low | (high << 32); 

,相關轉換的另一種方法是同樣簡單,

low = _pdep_u64(bitstring & 0xFFFFFFFF, 0x0F0F0F0F0F0F0F0FULL); 
high = _pdep_u64(bitstring >> 32, 0x0F0F0F0F0F0F0F0FULL); 

這兩種方法也適用於相反的順序,如果您只是首先反轉半字節,也可以通過位操作完成。