停止更新,遷移至ykpeng.com
阿新 • • 發佈:2019-01-03
使用有限的記憶體操作完成位元組中的位反轉。完成後,修改程式碼讓它執行得儘可能快(但沒有記憶體限制)
優化和正確性相比,總是居於次要位置。
uint8_t SwapBitsInByte(uint8_t input)
{
uint8_t output=0;
for(uint8_t i=0; i<8; i++)
{
if(input & (1 << i))
Output |= 1 << (7-i);
}
}
速度優先,記憶體足夠。可以使用查詢表的思想。(使用switch語句替換if-else語句的時候,編譯器也會建立一個查詢表,檢視彙編程式碼能找到)
uint8_t SwapBitInByte(uint8_t input)
{
const uint8_t lookup_table[256] = {0x00, 0x80, 0x40, 0xC0, ..., 0x7F, 0xFF};
return lookup_table[input];
}
當系統有較多的程式碼空間而希望縮短執行時間時。
減少記憶體消耗的一種比較好的方法,首先反轉相鄰的兩位,再反轉相鄰的兩個位元組,之後反轉半位元組。沒有使用零時變數,估計至多使用一個暫存器。
uint8_t SwapBitInByte(uint8_t val)
{
val = (val & 0x55) << 1 | (val & 0xAA) << 1;
val = (val & 0x33) << 2 | (val & 0xCC) << 2;
val = (val & 0x0F) << 4 | (val & 0xF0) << 4;
return val;
}