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

2021-08-18 09:59:07 字數 904 閱讀 3226

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位,則值為:100b = 4 

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

分析:這個題目相當於我們4.2.4.5中做的事情,只不過要用巨集來實現。

這個題目相當於是要把x的bit(n-1)到bit(m-1)取出來

複雜巨集怎麼分析:

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

第一步,先分清楚這個複雜巨集分為幾部分:2部分

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

分析為什麼要》(n-1),相當於是我們4.2.4.5中的第二步

第二步,繼續解析剩下的:又分為2部分

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

分析為什麼要&,相當於我們4.2.4.5中的第一步

第三步,繼續分析剩下的:

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

<<(n-1) 

這個分析時要搞清楚第2坨到底應該先左邊取反再右邊《還是先右邊《再左邊取反。

解法:第一,查c語言優先順序表;第二,自己實際寫個**測試。

說明這個式子應該是~(~(0u)<<(m-n+1))

<<(n-1) ,這就又分為2部分了

10001000

00001110

00001000

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 每日一道理 即使青春是一枝嬌豔的花,但我明白,一枝獨放永遠不是春天,春天該是...

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

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 ...

客來樂 變革與公升級,用技術點燃智慧型時代

近來,國內各大企業加緊了ai領域的布局,ai產業在我國快速發展,ai場景逐步落地。作為新零售行業的典型代表,客來樂通過其獨創的無縫接入線下收銀台互動技術,幫助商家以極低的成本和極高的效率,迅速由傳統零售模式一步跨入了讓客戶與商品形成數位化聯絡的新零售時代。積極推動ai場景的落地,客來樂一直在前行的路...