(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 的作用是強制轉...