1. 程式人生 > >位、位元組、進位制梳理與位操作

位、位元組、進位制梳理與位操作

資料型別(位、位元組、進位制)

位(bit)是計算機最基礎也是最小的資料度量
位是二進位制數例如:10101010 每一個數字便是一位(bit)
位元組 每一位元組有8位8bit
進位制是進位制,位是位
16進位制數0XFFFFFFFF
其中0X是16進位制數的標誌,表示標誌後面的數是16進位制的
其中每一個F可以表示成二進位制數 1111 所以 每一個16進位制數(單獨的一個數,不是指整個數)佔有 4 bit、半個位元組
選取高進位制的好處是能夠縮短資料長度

例如:十進位制數 65535 16進位制可以表示為 FFFF換算成 2進位制則為 1111 1111 1111 1111

stm32是32位的微控制器代表其可以處理的最長資料位32位最大值為 2^32 即可以表示為0x ffff ffff

位操作運算

符號 功能 作用
& 按位與 全為1才判斷是1
1 按位或 全為0才判斷是0
^ 按位異或 一樣為0不一樣為1
~ 取反 0為1,1為0
<< 左移 0101變成1010
>> 右移 0101變成0010

左移右移,移出的那一位置補0
1111<< = 1110 1111>> = 0111
在語法中常常寫做a&=b即是a=a&b的縮寫
a|=b a=a|b
GPROA_>BSRR |=0X01 //不改變前7位的值,將第零位置為1
GPROA_>BSRR &=~0X01 //也不改變前七位的值,將第零位置為0
TIMx->SR = (uint16_t)~TIM_FLAG; //也是把某位置零的操作

寫法上的小技巧:
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
這個操作就是將 BSRR暫存器的第pinpos位設定為1,為什麼要通過左移而不是直接設定一個固定的值呢?其實,這是為了提高程式碼的可讀性以及可重用性。這行程式碼可以很直觀明瞭的知道,是將第 pinpos位設定為1。如果你寫成 GPIOx->BSRR =0x0030; 這樣的程式碼就不好看也不好重用了。
類似這樣的程式碼很多:
GPIOA->ODR|=1<<5; //PA.5 輸出高,不改變其他位
這樣我們一目瞭然, 5告訴我們是第5位也就是第 6個埠, 1 告訴我們是設定為 1了。