當然,只是做你到底是怎麼說的,這樣的事情(未測試)
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);
這兩種方法也適用於相反的順序,如果您只是首先反轉半字節,也可以通過位操作完成。