0&0 0
0&1 0
1&0 0
1&1 1
0|0 0
0|1 1
1|0 1
1|1 1
1.不改變其他位的值的狀況下,對某幾個位進行設值。
先對需要設定的位用&操作符進行清零操作,然後用|操作符設值。
比如我要改變 gpioa 的狀態,可以先對暫存器的值進行&清零操作
gpioa->crl&
=0xffffff0f
;//將第 4-7 位清 0
然後再與需要設定的值進行|或運算
gpioa->crl|
=0x00000040
;//設定相應位的值,不改變其他位的值
2.判斷a的最低位是否為1
if
(a&=
0x01
)
3.將a的最低位設為0
a &=(
~0x01
)
&0x80 即 &0x1000 0000 即將低7位全部設為0 只看第8位 一般加上if用於判斷某一位是否為1
|0x80 即 | 0x1000 0000 即將低7位不變 第8位設為1 一般用於將某一特定位置1
usart3_rx_buf[usart3_rx_sta&0x7fff]=0
將usart3_rx_sta的值這一位設定為1表示結束
位與& 只有當1與1位與時才是1,其他的值相與都是0
位或| 只有兩個0位或的時候才是0,其餘的都是1
位異或 ^ 兩個數相等則為0,不相等則為1
左移位<< 右移位》 無符號數,左移時在右邊補0,右移時在左邊補0
1)特定位清零用&
譬如:將0xaaaaaaaa 的bit8 ~bit15清零,其他位保持不變。
分析:[位與]任何數(0/1)與1位與時為本身,與0位與為0,所以可以用位與的方式。
unsigned int a = 0xaaaaaaaa;
unsigned int b = 0xffff00ff;
unsigned int c;
c = a & b;
printf("c = 0x%x ", c); //c = 0xaaaa00aa
2)特定位 置1用 |
譬如:將0xffff00ff的bit8 ~bit15置1,其他位保持不變。
分析:位或 任何數(0/1)與1位或變為1,與0位或為本身
unsigned int a = 0xffff00ff;
unsigned int b = 0x000ff00;
unsigned int c;
c = a | b;
printf("c = 0x%x ", c); // = 0xffffffff
3)特定位取反用 ^
譬如:將0xffff00ff的bit8 ~bit15取反,其餘保持不變
分析:位異或 任何數(0/1)與1位異或會取反,與0位異或為本身
unsigned int a = 0xffff00ff;
unsigned int b = 0xff00;
unsigned int c;
c = a ^ b;
printf("c = 0x%x ", c); // = 0xffffffff
三、特定二進位制數的獲取
由於上面示例中的unsigned int b的值太過於呆板,後續看**的時候可能不知道為什麼是這個值,所以需要以另外的方式來表達(主要是通過位移和位取反來獲取這個特定的二進位制數)。
(1) 譬如:unsigned int b = 0xff00; 中的0xff00
可表示為:0xff<<8 (0xff :8個二進位制1 <<: 左移 8: 8位)
(2) 需要乙個bit3 bit7,bit23bit25為1的數(隱含意思是其他位都為0)
可為:0x1f<<3 | 0x7<<23
1f (7-3+1=5個1,轉換為十六進製制則為1f);
7 ( 25-23+1=3個1,轉換為十六進製制則為7)
| ( 位或,任何數與1位或都為1,與0位或為本身,所以這裡用位或就相當於把這2個位移後的數疊加起來)
(3) 需要乙個bit3 ~ bit7為0的數
可為:~(0x1f<<3)
總結:當需要的1比較少,需要的0比較多,就使用1位移的方式;當需要的0比較少,需要的1比較多,就使用位移然後取反的方式;當需要的數比較複雜,如bit3 bit7,bit23bit25為1,就可以先位移然後位或的方式。
p&=0x1110 清零最低位 其餘不變
C語言中的位操作
目錄 1.前言 2.數值在計算機中的表示 3.位運算 4.位段 正文 1.前言 為了節省記憶體空間,在系統軟體中常將多個標誌狀態簡單地組合在一起,儲存到乙個位元組 或字 中。語言是為研製系統軟體而設計的,所以她提供了實現將標誌狀態從標誌位元組中分離出來的位運算功能。所謂位運算是指,按二進位制位進行的...
C 語言中的位操作
在微控制器或是工業控制中,位操作是很常見的,利用微控制器實現跑馬燈的例項就可以通過位操作來實現。c 語言中也能夠實現位操作。微操作是針對資料的二進位制補碼形式的操作,位操作符主要有 位運算子含義 與 或 非 異或 左移 右移 與等 或等 異或等 左移等 右移等 可以用下邊的類似程式實現二進位制的輸出...
學習C語言中的位操作
最近在寫程式時,我需要判斷乙個dword 型別變數的某乙個二進位制位是否為1或0,我們都很清楚,dword型別的變數在記憶體中佔32位,現在要我們判斷其中的某一位是0還是1,該如何是好呢?這時我想到了c語言中的位操作,借助位操作,可以實現我們想要的功能。關於位操作,我從網上收集整理的資料如下 一 位...