c語言的按位或,與,非運算子c語言的按位元運算符

來源:互聯網
上載者:User

位元運算符
C提供了六種位元運算運算子;這些運算子可能只允許整型運算元,即char、short、int和long,無論signed或者unsigned。
& 按位AND
| 按位OR
^ 按位異或
<< 左移
>> 右移
~ 求反(一元運算)
按位與操作&通常用於掩去某些位,比如
n = n & 0177;
使得n中除了低7位的各位為0。
按位或操作|用於開啟某些位:
x = x | SET_ON;
使得x的某些SET_ON與相對的位變為1。
按位異或操作^使得當兩個運算元的某位不一樣時置該位為1,相同時置0。
應該區分位操作符&、|與邏輯操作符&&、||,後者從左至右的評價一個真值。比如,如果x為1、y為2,那麼x & y為0,而x && y為1。
移位元運算符<<和>>將左側的運算元左移或者右移右運算元給定的數目,右運算元必須非負。因此x << 2將x的值向左移動兩位,用0填充空位;這相當於乘4。右移一個無符號數會用0進行填充。右移一個帶符號數在某些機器上會用符號位進行填充(“算數移位”)而在其他機器上會用0進行填充(“邏輯移位”)。
單目運算子~對一個整數求反;即將每一個1的位變為0,或者相反。比如
x = x & ~077
將x的後六位置0。注意x & ~077的值取決於字長,因此比如如果假設x是16位元那麼就是x & 0177700。這種簡易型式並不會造成額外開銷,因為~077是一個常數運算式,可以在編譯階段被計算。
作為一個使用位操作的執行個體,考慮函數getbits(x,p,n)。它返回以p位置開始的n位x值。我們假設0位在最右邊,n和p是正數。例如,getbits(x,4,3)返回右面的4、3、2位。
/* getbits: 返回從位置p開始的n位 */
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
運算式x >> (p+1-n)將需要的域移動到字的右側。~0是全1;將其左移n為並在最右側填入0;用~使得最右側n個1成為掩碼。

----------------------------------

c語言的按位元運算符

 

& 按位與 | 按位或 ^ 按位異或 1. 按位與運算 按位與運算子"&"是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。 例如:9&5可寫算式如下: 00001001 (9的二進位補碼)&00000101 (5的二進位補碼) 00000001 (1的二進位補碼)可見9&5=1。 按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的位元為0000000011111111)。 main(){ int a=9,b=5,c; c=a&b; printf("a=%d/nb=%d/nc=%d/n",a,b,c); } 2. 按位或運算 按位或運算子“|”是雙目運算子。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。 例如:9|5可寫算式如下: 00001001|00000101 00001101 (十進位為13)可見9|5=13 main(){ int a=9,b=5,c; c=a|b; printf("a=%d/nb=%d/nc=%d/n",a,b,c); }

3. 按位異或運算 按位異或運算子“^”是雙目運算子。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進位為12) main(){ int a=9; a=a^15; printf("a=%d/n",a); }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

4.按位異或運算子^   參與運算的兩個值,如果兩個相應位相同,則結果為0,否則為1。即:          0^0=0, 1^0=1, 0^1=1, 1^1=0   例如:     10100001^00010001=10110000

                                   0^0=0,0^1=1  0異或任何數=任何數

                                    1^0=1,1^1=0  1異或任何數-任何數取反

                                                              任何數異或自己=把自己置0   (1)按位異或可以用來使某些特定的位翻轉,如對數10100001的第2位和第3位翻轉,可以將數與00000110進行按位異或運算。           10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6   (2)通過按位異或運算,可以實現兩個值的交換,而不必使用臨時變數。例如交換兩個整數a,b的值,可通過下列語句實現:     a=10100001,b=00000110     a=a^b;   //a=10100111     b=b^a;   //b=10100001     a=a^b;   //a=00000110    (3),在組合語言中經常是變數置零:

 

& 按位與 | 按位或 ^ 按位異或 1. 按位與運算 按位與運算子"&"是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。 例如:9&5可寫算式如下: 00001001 (9的二進位補碼)&00000101 (5的二進位補碼) 00000001 (1的二進位補碼)可見9&5=1。 按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的位元為0000000011111111)。 main(){ int a=9,b=5,c; c=a&b; printf("a=%d/nb=%d/nc=%d/n",a,b,c); } 2. 按位或運算 按位或運算子“|”是雙目運算子。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。 例如:9|5可寫算式如下: 00001001|00000101 00001101 (十進位為13)可見9|5=13 main(){ int a=9,b=5,c; c=a|b; printf("a=%d/nb=%d/nc=%d/n",a,b,c); }

3. 按位異或運算 按位異或運算子“^”是雙目運算子。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進位為12) main(){ int a=9; a=a^15; printf("a=%d/n",a); }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

4.按位異或運算子^   參與運算的兩個值,如果兩個相應位相同,則結果為0,否則為1。即:          0^0=0, 1^0=1, 0^1=1, 1^1=0   例如:     10100001^00010001=10110000

                                   0^0=0,0^1=1  0異或任何數=任何數

                                    1^0=1,1^1=0  1異或任何數-任何數取反

                                                              任何數異或自己=把自己置0   (1)按位異或可以用來使某些特定的位翻轉,如對數10100001的第2位和第3位翻轉,可以將數與00000110進行按位異或運算。           10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6   (2)通過按位異或運算,可以實現兩個值的交換,而不必使用臨時變數。例如交換兩個整數a,b的值,可通過下列語句實現:     a=10100001,b=00000110     a=a^b;   //a=10100111     b=b^a;   //b=10100001     a=a^b;   //a=00000110    (3),在組合語言中經常是變數置零:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.