用巨集定義來完成位運算(置位,復位,擷取)

2021-07-22 16:52:31 字數 1036 閱讀 6543

1、置位

置位特定位n:

#define   set_nth_bit(x, n)   ( x | ((1u)<<(n-1)) )

置位n到m位:

#define  set_bit_n_to_m(x,n,m)

(x | (~((~0u)<<(m-n+1)))<<(n-1))

分析:第一步

:(  (~0u)  <<(m-n+1) ) 執行結果是等到0到(

m-n+1

)位是0

,(m-n+2

)到31位是1

第二步

:(~

((~0u)<<(m-n+1)))將第一步的執行結果按位取反。即0到(

m-n+1

)位是1

,(m-n+2

)到31位是0

第三步

:(~((~0u)<<(m-n+1)))

<<(n-1)

將第二步的32位數向左移動(

n-1)位,等到(

n-1)到(

m-1)位為

1,其餘為0。

第四步

:採用位或,將特定位置為1/

2、復位

復位特定位:#define   clear_nth_bit(x, n)  ( x & ~((1u)<<(n-1)) )

復位n到m位:

#define clear_bit_n_to_m(x,n,m)

(x & ((~0u)<<(m-n+1))<<(n-1))

3、擷取變數的部分連續位

#define   getbits(x, n, m)   ( (x & ~(~(0u)<<(m-n+1))<<(n-1)) >> (n-1) )  

4 2 6 技術公升級 用巨集定義來完成位運算

4.2.6.1 直接用巨集來置位 復位 最右邊為第1位 define set nth bit x,n x 1u n 1 define clear nth bit x,n x 1u n 1 4.2.6.2 擷取變數的部分連續位。例如 變數0x88,也就是10001000b,若擷取第2 4位,則值為 1...

用巨集交換奇偶位

第一次嘗試 include 在32位系統下 要拿出奇數字則需要 01010101010101010101010101010101 也就是十六進製制的0x55555555 要拿出偶數字則需要 10101010101010101010101010101010 也就是十六進製制的0xaaaaaaaa 最終...

nullnull用巨集定義swap(x,y)

之前一直在查詢nullnull之類的問題,今天正好有機會和大家共享一下.方法1 define swap x,y x x y y x y x x y 方法2 define swap x,y x x y y x y x x y 每日一道理 即使青春是一枝嬌豔的花,但我明白,一枝獨放永遠不是春天,春天該是...