嵌入式中C語言的位操作

2021-10-09 07:01:21 字數 2188 閱讀 9843

位運算構建特定的二進位制數

技術公升級:使用巨集定義完成位運算

總結在操作中使用&將暫存器某些 特定位變成0,但是不影響其他位,可以進行如下操作,假設原來的暫存器reg1中的值為0xaaaaaaaa,希望將bit8-bit15清零並且其他位不進行改變,將這個數和0xffff00ff進行位與即可。

reg1

&=0xffff00ff

;

在操做中使用|將某些特定的位置1使用|,構建乙個合適的數與原來的數進行位或操作,舉例:reg1中的值為0xaaaa00aa,希望將bit8-bit15置1並且其他位不進行改變,將這個數和0x0000ff00進行位或即可。

reg1

|=0x0000ff00

;

經過上面的操作後,達到特定位置1的目的(即得到0xaaaaffaa)。

希望某乙個暫存器的某些位特定位0變為1,而1變為0,即取反不影響其他位,可以對目標資料進行異或操作。reg1中的值為0xaaaaaaaa,希望將bit8-bit15置1並且其他位不進行改變,將這個數和0x0000ff00進行異或即可。

reg1

^=0x0000ff00

;

經過上面的操作,可以得到reg1 = 0xaaaa55aa,達到特定的位取反的目的。

對暫存器進行特定的位子進行操作,事情的關鍵是進行特定的數字的計算進行操作,但是這樣的操作費事,因此,需要使用位運算(位或、位與、取反)快速的構建需要的運算元。

舉例說明:獲取bit3-bit7為1,同時bit23-bit25為1,其餘位為0的數。

進行二進位制構造。

bit3-bit7:以bit0為基準構造結果為0x1f;

bit23-bit25:以bit0為基準構造結果為0x07;

構造的結果如下所示:

int a =

(0x1f

<<3)

|(0x07

<<23)

;

舉例:要獲得bit4-bit10為0(該數總共為32bit),其餘全部為1的數。

進行二進位制構造

設定bit4-bit10為0,可以先給出反碼,其餘bit為0,(01111111<<4),得到數字後,對其進行取反操作。

int a =~(

0x7f

<<4)

;

使用巨集定義將乙個32位二進位制數x的第n位置位。

1、顯然這個巨集又兩個引數,即x和n,所以其模型為 #define set_bit_n(x,n) *** 。

2、對其中乙個進行復位,我們將該位和1相或,其他位和0相或即可,所以得到x|(1<<(n-1))。

3、所以定義為 #define set_bit_n(x,n) ((x) | (1<<((n)-1)))

用巨集定義將乙個32位二進位制數x的第n位(從右邊算起也就是bit0第一位)清零。

1、其模型為 #define clr_bit_n(x,n) *** 。

2、對其中的一位進行清零,可以將該位和0相與,其他位和1相與即可,即:x&~(1<<(n-1))。

3、所以該巨集定義為 #define clr_bit_n(x,n) (x&~(1<<(n-1)))

該實現的是擷取指定的連續位作為乙個新值,例如變數0x88,也就是0b10001000,擷取第二到第四位,值為0b100 = 4;

#define getbits

(x,n,m)

((x&~(

~(0u)<<

(m-n+1)

)<<

(n-1))

>>

(n-1

))

在此對上面的式子進行解釋:

最裡面的~(0u)<<(m-n+1), ~(0u)得到的是乙個32位數(ffff),對其進行左移(m-n+1)就是進行移動差值的數量。

外面的~ (~(0u)<<(m-n+1))<<(n-1)是對 ~(0u)<<(m-n+1)進行取反,再左移(n-1)位,目的是將取得的值放置在m到n的位置上。

最後(x& ~ (~(0u)<<(m-n+1))<<(n-1))>>(n-1)就是將目標值位與計算值再將其右移(n-1)位。最後得到應得的值。

這個方核心在於捏造了 ~(0u),這個數值,我要進行寫的話肯定會寫(ffff ffff)qaq。

後面多進行使用與練習,融匯貫通。

嵌入式程式設計 c位操作

在學習c語言位操作前需要具備十六進製制和二進位制的知識以及從二進位制與十六進製制的相互轉換,相應的教程請移步新增鏈結描述 現在掌握了十六進製制和二進位制之間的相互轉換知識,我們可以從c中的按位 或位級別 運算開始。基本上有6種型別的按位運算子。這些是 1.以 表示 或 運算子 2.以 表示 與 運算...

嵌入式 位 bit 操作

嵌入式系統總是要使用者對變數或暫存器進行位操作。給定乙個整型變數 a,寫兩段 第乙個設定a的 bit 3 第二個清除a 的 bit 3 在以上兩個操作中,要保持其它位不變。對這個問題有三種基本的反應 1 不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。2 用 bit fields bit fi...

嵌入式學習(二) 嵌入式系統C 語言

1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...