使用有限的記憶體操作完成位元組中的位反轉。完成後,修改**讓它執行得盡可能快(但沒有記憶體限制)
優化和正確性相比,總是居於次要位置。
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] = ;
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;
簡單實用演算法 位元組位序反轉
演算法概述 反轉乙個位元組說的是位序反轉,別將它和大端轉小端混淆了,所謂大端和小端指的是位元組序。位元組位序反轉的實現vb.net教程演算法很多,就是看看誰的演算法效率更高了。高手不是能寫出最美麗的程式而是能寫出既美麗同時效率又是最高的程式。如果乙個人寫的程式很美麗,很直觀,只能說明該程式設計師對語...
NandFlash的位反轉
flash位反轉 由於flash固有的特性,在讀寫資料過程中,偶然會產生一位或幾位資料錯誤 這種概率很低 bit位從 1 變為 0 或者從 1 變為 0 當位反 生在關鍵的 資料上時,有可能導致系統崩潰。當僅僅是報告位反轉,重新讀取即可 如果確實發生了位反轉,則必須有相應的錯誤檢測 恢復措施。在na...
java中位元組與位的轉換
使用場景 用於解析自定義協議,比如某一位代表乙個狀態 public class byteutils return bytearr 把byte轉為字串的bit param b return public static string bytetobitstring byte b 獲取乙個位元組第n位,思...