linux內核實在是博大精深,有很多優秀的算法,我之前在工作中就遇到過位數高低位交換的問題,那時候對於C語言還不是很熟練,想了很久才寫出來。最近在看內核的時候看到有內核的工程師實現了這樣的算法,和我之前想的一樣,那麼今天就把它分享出來吧。
在開發需求中,有要實現32位、16位、8位數高低位交換的算法。那麼我們具體看看代碼實現:
還是一樣,從linux內核中將代碼摳出來:
#include運行結果://將一個8位數高低4位交換 static inline unsigned char bswap_8(unsigned char v) { return ((v & 0xff) << 4) | (v >> 4) ; //將參數(v & 0xff) << 4 相當於放到高位, v >> 4 位相當於放在低位 } //以下兩個代碼分析雷同 //將一個16位數高低8位交換 static inline unsigned short bswap_16(unsigned short v) { return ((v & 0xff) << 8) | (v >> 8); } //將一個32位數高低16位交換 static inline unsigned int bswap_32(unsigned int v) { return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | (v >> 24); } int main(void) { unsigned short v = 0x1000 ; printf("1、\n原來的v:%d\n",v); printf("16位數高低8位轉化後的v:%d(0x%x)=========>0x%x--->%d\n",v,v ,bswap_16(v),bswap_16(v)) ; unsigned char a = 0x0a ; printf("\n2、\n原來的a:%d\n",a); printf("8位數高低4位轉化後的a:%d(0x%x)==========>0x%x--->%d\n",a,a ,bswap_8(a),bswap_8(a)) ; unsigned int b = 0x00001111; printf("\n3、\n原來的b:%d\n",b); printf("32位數高低16位轉化後的b:%d(0x%x)========>0x%x--->%d\n",b,b ,bswap_32(b),bswap_32(b)) ; return 0 ; }
從運行結果看,三個接口分別實現了數據高低位的交換,驗證成功!