位與,位或,位異或運算符的理解


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  清除掉了..呵呵~~~

如果只把bit4清0操作怎么辦呢..其實就是

0xD2 & ~(0x1 << 4)  //結果為0XC2

也就是:1101 0010  =>  1100 0010 了(第4位,再次強調下是右邊從0開始數哦)

理解了么~~~再看看怎么取值,假設我們要取1101 0010紅色段位的值,也就是第2位到第4位,這里只是舉例,一般都是取段位的

(0xD2 & (0x7 << 2)) >> 2  //除了第3-第5位全部清0,注意0x7是3個1(4-2+1)個人 再左移2位 這里沒有取反,再右移2位,這里是從第二位開始.

結果剛好是 0x4 二進制為:0100,是不是剛好是紅色的數字呢,呵呵,注意一般取值至少有個1,要不然取出來就是0了

右移兩位后

剛好是我們要取值的那個位...

 再如: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位也是一樣的..稍理解下親就明白了.....



今天就寫到這吧~~~





好久沒有寫,感覺不會寫了..


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM