1.位與符號是&
真值表達式爲: 1&1=1,1&0=0,0&1=0,0&0=0
記憶方式:&& 咱們很容易理解..其實就是真真才爲真,至關於&&必須兩個條件爲真時才爲真,這樣是否是很好理解.
用途:通常用於位清零操做,和取位值操做
例如: int x = 0xD2;
二進制數爲:
0000 0000 0000 0000 0000 0000 1101 0010(32位編譯,右邊開始數,0位開始)
咱們要把從bit4-bit7清0操做就能夠直接用編程
0xD2 &= ~(0xf << 4) //最後的結果是0x2
能夠這樣理解:0xf能夠這樣理解, (7-4+1)個1 也就是4個1(1111),16進製表示0xf; 左移4位就是從哪位開始清,就左移幾位的,獲得結果就是 1111 0000 再求反獲得結果就是 0000 1111,而後進行位與操做就恰好把 前半段 1101 清除掉了..呵呵~~~spa
若是隻把bit4清0操做怎麼辦呢..其實就是code
0xD2 & ~(0x1 << 4) //結果爲0XC2
也就是:1101 0010 => 1100 0010 了(第4位,再次強調下是右邊從0開始數哦)blog
理解了麼~~~再看看怎麼取值,假設咱們要取1101 0010紅色段位的值,也就是第2位到第4位,這裏只是舉例,通常都是取段位的開發
(0xD2 & (0x7 << 2)) >> 2 //除了第3-第5位所有清0,注意0x7是3個1(4-2+1)我的 再左移2位 這裏沒有取反,再右移2位,這裏是從第二位開始.
結果恰好是 0x4 二進制爲:0100,是否是恰好是紅色的數字呢,呵呵,注意通常取值至少有個1,要否則取出來就是0了it
右移兩位後
編譯
恰好是咱們要取值的那個位...class
再如:1101 0010 第4-7位加12是怎麼作到的呢(通常開發板編程會這樣用的)二進制
以下思路:方法
//注意不是設置值,若是是設置值,通常咱們直接清0,而後直接進行與或就好. //1.取出第4位到第7位的值 int tmp = (0xD2 & (0xf << 4)) >> 4; //2.直接這個值加上12 tmp += 12; //3.對第4到第7位清0操做 int y = 0xD2 & ~(0xf << 4); //4.再用原來的值對 tmp 進行與或(注意這個地方要左移4位還原到咱們取值的位置) y = y | (tmp << 4); //結果爲:0x192 二進制:1 1101 0010 printf("0x%X \n", y); //驗證方法: int a = (0x192 - 0xD2) >> 4;//若是恰好是12(0xc)那就說明對了,這裏注意要右移4位,到默認位上去檢驗 printf("0x%X \n", a);//其結果恰好是0xc,也就是12
以上是一些基本的操做... &運算符還有一些更強大的計算
2.位或符號是|
真值表達式爲: 1|1=1,1|0=1,0|1=1,0|0=0
記憶方式:|| 咱們很容易理解..其實就是假假才爲假,至關於||必須兩個條件爲假時才爲假,任何有爲真的都是返回真的,這樣是否是很好理解.
用途:通常用於位段設置值的操做,再回到上面的例子能夠再理解一下
鞏固下下面的宏
//設置x的第n到m位爲1 n(0開始) < m #define SET_BIT_N_M(x, n, m) ( x | ~( (~0U) << (m - n +1 ) ) << n )
這段宏的理解咱們分開來理解下
第一步:~0U => ~(0000 0000 0000 0000 0000 0000 0000 0000) => 1111 1111 1111 1111 1111 1111 1111 1111
第二步:<< (m - n+1 )這裏假設爲0-3 << (3 - 0 +1 ) => 左移這個位數恰好 => 1111 1111 1111 1111 1111 1111 1111 0000=>再取反=>0000 0000 0000 0000 0000 0000 0000 1111第三步: 0000 0000 0000 0000 0000 0000 0000 1111 再左移 0位仍是1111第四步:進行與或操做,就所有是1了..是否是好理解了..~~~~~文中說的是32位的數,這個宏在64位也是同樣的..稍理解下親就明白了.....今天就寫到這吧~~~很久沒有寫,感受不會寫了..