問題
對乙個位元組資料,逐個交換其高低位,例如11010001,經過0-7,1-6,2-5,3-4對應位的交換,變成10001011 。
解決思路
對於該問題,我們最先想到的是對原位元組通過移位操作來逐位處理,使用另乙個變數來儲存交換後的結果。這種解決方案處理起來思路清晰,編寫**應該不難。
下面是該思路對應的**:
[cpp]
unsigned char shift_fun1(unsigned char data)
printf(" after shift fun1 data=%x \n",tmp);
return tmp;
} 上述**實現起來不難,而且效率還是比較高的。但是還有比這更簡潔的解決方法,在嵌入式開發中遇到交換位元組位的問題時通常使用蝶式交換法和查表法來實現。查表法顧名思義即將一些值存到記憶體中,需要計算時查表即可,但是也會占用額外的儲存空間。這裡主要再介紹一下蝶式交換法。
所謂的蝶式交換是這樣的:
[cpp]
data=(data<<4)|(data>>4);
data=((data<<2)&0xcc)|((data>>2)&0x33);
data=((data<<1)&0xaa)|((data>>1)&0x55);
我們可以做一下執行演算:
假設原始位序列為 0 1 0 1 1 0 0 1
data=(data<<4)|(data>>4);之後序列為 1 0 0 1 0 1 0 1
data=((data<<2)&0xcc)|((data>>2)&0x33); 之後序列為 0 1 1 0 0 1 0 1
data=((data<<1)&0xaa)|((data>>1)&0x55); 之後序列為 1 0 0 1 1 0 1 0
更抽象的來說 原始位為 1 2 3 4 5 6 7 8
data=(data<<4)|(data>>4); 之後位序為 5 6 7 8 1 2 3 4
data=((data<<2)&0xcc)|((data>>2)&0x33); 之後位序為 7 8 5 6 3 4 1 2
data=((data<<1)&0xaa)|((data>>1)&0x55); 之後位序為 8 7 6 5 4 3 2 1
由此完成了整個位的逆序轉換,下面是具體的實現**:
[cpp]
unsigned char shift_fun2(unsigned char data) 總結
交換位元組的高低位並不是乙個很常見的問題,遇到該問題時,需要經過仔細的分析,加上對c語言位操作的熟練掌握,就能夠很好的解決這一類的問題。
演算法 位元組高低位交換
對乙個位元組資料,逐個交換其高低位,例如11010001,經過0 7,1 6,2 5,3 4對應位的交換,變成10001011 對於該問題,我們最先想到的是對原位元組通過移位操作來逐位處理,使用另乙個變數來儲存交換後的結果。這種解決方案處理起來思路清晰,編寫 應該不難。下面是該思路對應的 unsig...
演算法 位元組高低位交換
對乙個位元組資料,逐個交換其高低位,例如11010001,經過0 7,1 6,2 5,3 4對應位的交換,變成10001011 對於該問題,我們最先想到的是對原位元組通過移位操作來逐位處理,使用另乙個變數來儲存交換後的結果。這種解決方案處理起來思路清晰,編寫 應該不難。下面是該思路對應的 cpp v...
高低位交換
給出乙個小於2 32的正整數。這個數可以用乙個32位的二進位制數表示 不足32位用0補足 我們稱這個二進位制數的前16位為 高位 後16位為 低位 將它的高低位交換,我們可以得到乙個新的數。試問這個新的數是多少 用十進位制表示 例如,數1314520用二進位制表示為0000 0000 0001 01...