C語言對暫存器的位操作

2021-10-24 02:09:57 字數 2491 閱讀 3122

(1)位與& 邏輯與&& 1&1=1 1&0=0 0&0=0 0&1=0

(2)位或 | 邏輯或 || 1 | 1=1 1 | 0=1 0 | 0=0 0 | 1=1

(3)位取反~ 邏輯取反 !

(4)位異或 ^ 不同為1,相同為0 1^1=0 1^0=1 0^0=0 0^1=1

總結:

(5)移位操作

暫存器的操作要求:操作暫存器時,要求改變某一特定位,而不影響其他位

如何實現:讀出—>改相應位—>寫入

​ 基本思路:暫存器特定位改變而不影響其他位,構造合適的1和0組成的數和這個暫存器原來的值位與、位或、位取反

特定位置1用 | (用1置1)

特定位取反用^ (用1取反)

**舉例

unsigned int a = 0xa12aaaa7;

unsigned int b = 0xffff00ff;

unsigned int c;

c = a & b;

// 16進製制數的列印

printf("a & b = %#x.\n", c);

printf("a & b = 0x%x.\n", c);

​ 回顧:清零用&,置1用 | ,取反用^

​ ~和<< >>用來構建特定二進位制數

unsigned int a ; // 定義無符號數,如果是有符號數,那麼位移就會出問題

再將a右移3位

再將937寫入bit7-bit17,其他位不變

給temp加17

將bit7-bit17清零

將temp算出的值寫入到bit7-bit17

再將937賦值到bit7-bit17,17賦值到bit21-bit25

printf(「a = %u.\n」, a); // %u 列印無符號數

// 置位

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

// 復位

#define clear_nth_bit(x, n) (x & ~ ( (1u) << (n-1) ) )

// 1後邊的u表示這個數字是無符號數(有符號數的右移是會出問題的)

// 關鍵點:我們需要乙個算式來得到(m-n+1)個1的十六進製制數

// 第1步,先得到32個1: ~0u (~按位取反得到32個1,如果直接1u那麼就只有bit0位1)

// 第2步,將得到的數右移x位即可得到(m-n+1)個: (~0u) >> (32-(m-n+1)) 或 ~(~0u<<(m-n+1))

#define set_bit_n_m(x, n, m) (x | (((~0u) >> (32-(m-n+1))) << (n-1)))

#define set_bit_n_m(x, n, m) (x | ~(~0u<<(m-n+1))<<(n-1))

// 給定乙個整型數a,取出a的bit3-bit8

// 先將a的bit3-bit8不變,其餘位清零 a &= (0x3f<<3)

// 再將a右移3位 a >>= 3

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

// 思路:

// 先將x的bit(n-1)-bit(m-1)不變,其餘位清零

// 得到(m-n+1)個1的十六進製制數 ~(~0u << (m-n+1)) (得到0x3f)

// 將得到的16進製制數左移(n-1) ~(~0u << (m-n+1)) << (n-1) (得到0x3f<<3)

// x和左移後的數字與 x & ~(~0u << (m-n+1)) << (n-1) (a &= (0x3f<<3))

// 再將x右移(n-1)位

// 位與後的數右移(n-1) (x & ~(~0u << (m-n+1)) << (n-1)) >> (n-1)

// 最終結果

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

// 得到(m-n+1)個1的十六進製制數的兩種方式:

// 32位的1先左移(m-n+1)位,那麼低(m-n+1)位位0,高(32-(m-n+1))位為1,再將其按位取反,

// 就得到低(m-n+1)位為1,高(32-(m-n+1))位為0。

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

// 有(m-n+1)個1,那麼就有32-(m-n+1)個0,將32位的1先右移32-(m-n+1),

// 那麼高32-(m-n+1)位為0,低(m-n+1)位為1。

(~0u) >> (32-(m-n+1))

C語言對暫存器封裝

一 封裝外設 用c語言 把外設位址對映用巨集定義封裝 外設基位址 define periph base unsigned int 0x40000000 匯流排基位址 define apb1periph base periph base define apb2periph base periph ba...

位操作(暫存器)

stm32中cpu是32位的。最方便快捷的方法是直接操作32位的位址,對某個位址直接賦值是最快的操作,只需要乙個指令。附錄1 在32位的系統中 1字 word 4位元組 byte 1位元組 byte 8位 bit 1b 8bit 1kb 1024b 2 10b 1mb 1024kb 1gb 1024...

指標 暫存器 位操作

define periph base unsigned int 0x40000000 define apb2periph base periph base 0x00010000 define gpiob base apb2periph base 0x0c00 unsigned int 的作用是強制轉...