2011-11-08 67 views
1

可能重複:
Best Algorithm for Bit Reversal (from MSB->LSB to LSB->MSB) in C是否有任何標準的C函數bitswapping?

我有一個64位的字,我想這樣做就可以了以下操作。

首先,我想要做一個比特交換(SWAP位63位0 交換位62位1等)

一旦上面的操作完成後我想要做一個字節交換交換字節0和字節7之間 字節1和字節6等。

現在我們確實有在GCC的linux的內置函數來完成第二部分bswap_64(),有什麼功能都做在GCC Linux下C提供的第一部分

+1

不,但我們確實有這些做這些操作的「操作員」,這些操作... –

+0

**爲什麼**要交換位?無論是FFT還是家庭作業,恕我直言。 – wildplasser

+0

@ wildplasser.it既不是FFT也不是家庭作業。我捕獲了一些空閒的10GE幀,我試圖將其轉換爲XGMII編碼幀。 :) – liv2hak

回答

6

最終的效果是一樣的比特交換每個字節到位。例如,字節0首先被複制到字節7,其位反轉,然後被複制回字節0而不反轉位。

這些操作沒有內置的支持,但是每個字節的位交換應該相當簡單。最有效的方法可能是一個256個元素的查找表。

uint64_t the_word = /* whatever */ 
unsigned char *bytes = &the_word; 
for (i = 0; i < 7; i ++) { 
    bytes[i] = reverse[bytes[i]]; 
} 

其中:

const unsigned char reverse[UCHAR_MAX+1] { 
    0x00, 0x80, ..., 0xFF 
} 

可以編寫一個小程序,計算每個字節值位交換值,併產生用於bytes初始化的源代碼。 (或者,由於您正在編寫代碼來執行計算,您可以在程序中將其用於代替查找表;這取決於速度的重要程度。)

這假定,例如,那CHAR_BIT == 8,這是不能保證的語言。

我還沒有測試過這個。

+0

根據基準[有](http://stackoverflow.com/questions/746171/best-algorithm-for-bit-reversal-from-msb-lsb-to-lsb-msb-in-c),它可能是更好地手動展開循環並使用整數算術,因爲編譯器可能不聰明(並且字節尋址通常很慢)。將'bytes'聲明爲'restrict'也有幫助。基準測試當然是您的指導。 –

+0

@AlexandreC .:我只是修正了錯字。 –

相關問題