C語言學習篇(9)-----位操作(三)

在很多開源項目中都會使用宏定義的方式實現一些特定的位運算,以及在一些面試

過程中,都會涉及分析其工作原理,因此這節來拓展下宏定義實現位運算的知識。

宏定義實現第n位置位

<code>#define   SET_BIT_N(x, n)   (x | (1U

代碼驗證:

C語言學習篇(9)-----位操作(三)

宏定義實現置位


宏定義實現第n位清零

<code>#define CLEAR_BIT_N(x, n)		(x & ~(1U

代碼驗證:

C語言學習篇(9)-----位操作(三)

宏定義實現清零


難度加大: 宏定義實現第n位到第m位置位

<code>#define SET_BIT_N_M(x, n, m)	(x | (((~0U)>>(32-(m-n+1)))

剖析:

  1. 如果n=2, m=5,則就是把bit2~bit5置位
  2. 因此我們需要一個算式來得到(m-n+1)個1:
  3. 算式實現: 先得到32位1: ~0U
  4. 將第3)得到的數,右移(32-(m-n+1))位就得到了低(m-n+1)全為1,其他高位為0的數
<code>                                          (~0U)>>(32-(m-n+1))/<code>

5. 之後並左移n位後位與(|)操作

代碼驗證:

C語言學習篇(9)-----位操作(三)

宏定義實現多位置位


截取變量的部分連續位

<code>#define  GET_BITS(x, n, m)    ((x & ~(~(0U)<> (n))/<code>

代碼驗證:

C語言學習篇(9)-----位操作(三)

獲取連續位


總結

關於位操作和運算就介紹到這,經過這幾篇內容下來,如果能夠完全消化,相信對常見的位運算已經比較熟練了,尤其在看一些開源項目代碼中,一些位運算的技巧處處可見,如uboot等,對自身的編程功底有一定補充作用。如有疑問,歡迎評論轉發收藏~


C語言學習篇(9)-----位操作(三)

C語言學習筆記


分享到:


相關文章: