在很多開源項目中都會使用宏定義的方式實現一些特定的位運算,以及在一些面試
過程中,都會涉及分析其工作原理,因此這節來拓展下宏定義實現位運算的知識。宏定義實現第n位置位
<code>#define SET_BIT_N(x, n) (x | (1U代碼驗證:
宏定義實現第n位清零
<code>#define CLEAR_BIT_N(x, n) (x & ~(1U代碼驗證:
難度加大: 宏定義實現第n位到第m位置位
<code>#define SET_BIT_N_M(x, n, m) (x | (((~0U)>>(32-(m-n+1)))剖析:
- 如果n=2, m=5,則就是把bit2~bit5置位
- 因此我們需要一個算式來得到(m-n+1)個1:
- 算式實現: 先得到32位1: ~0U
- 將第3)得到的數,右移(32-(m-n+1))位就得到了低(m-n+1)全為1,其他高位為0的數
<code> (~0U)>>(32-(m-n+1))/<code>5. 之後並左移n位後位與(|)操作
代碼驗證:
截取變量的部分連續位
<code>#define GET_BITS(x, n, m) ((x & ~(~(0U)<> (n))/<code>代碼驗證:
總結
關於位操作和運算就介紹到這,經過這幾篇內容下來,如果能夠完全消化,相信對常見的位運算已經比較熟練了,尤其在看一些開源項目代碼中,一些位運算的技巧處處可見,如uboot等,對自身的編程功底有一定補充作用。如有疑問,歡迎評論轉發收藏~