1. 程式人生 > >停止更新,遷移至ykpeng.com

停止更新,遷移至ykpeng.com

使用有限的記憶體操作完成位元組中的位反轉。完成後,修改程式碼讓它執行得儘可能快(但沒有記憶體限制)

優化和正確性相比,總是居於次要位置

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;

}