單片機(jī)中高低位交換如何實(shí)現(xiàn)?蝶式交換法了解一下
對(duì)于該問題,我們最先想到的是對(duì)原字節(jié)通過移位操作來逐位處理,使用另一個(gè)變量來存儲(chǔ)交換后的結(jié)果。這種解決方案處理起來思路清晰,編寫代碼應(yīng)該不難。
下面是該思路對(duì)應(yīng)的代碼:
上述代碼實(shí)現(xiàn)起來不難,而且效率還是比較高的。
但是還有比這更簡(jiǎn)潔的解決方法,在嵌入式開發(fā)中遇到交換字節(jié)位的問題時(shí),通常使用蝶式交換法和查表法來實(shí)現(xiàn)。查表法顧名思義即將一些值存到內(nèi)存中,需要計(jì)算時(shí)查表即可,但是也會(huì)占用額外的存儲(chǔ)空間。
這里主要再介紹一下蝶式交換法。
所謂的蝶式交換是這樣的:
我們可以做一下執(zhí)行演算:
假設(shè)原始位序列為 ?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); 之后位序?yàn)??5 6 7 8 ?1 2 3 4
data=((data<<2)&0xcc)|((data>>2)&0x33); ??之后位序?yàn)??7 8 5 6 ?3 4 1 2
data=((data<<1)&0xaa)|((data>>1)&0x55); ? 之后位序?yàn)??8 7 6 5 ?4 3 2 1 ?
由此完成了整個(gè)位的逆序轉(zhuǎn)換,下面是具體的實(shí)現(xiàn)代碼:
交換字節(jié)的高低位并不是一個(gè)很常見的問題,遇到該問題時(shí),需要經(jīng)過仔細(xì)的分析,加上對(duì)C語言位操作的熟練掌握,就能夠很好的解決這一類的問題。
免責(zé)聲明:本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。如有問題,請(qǐng)聯(lián)系我們,謝謝!
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!