《c/c++位運算》總結——c/c++的位運算符使用技巧

C語言的位運算有:與(&)、或(|)、異或(^)、取反(~)、左移(<<)、右移(>>)
位運算是指按二進制進行的運算,這些運算符只能用於整型操作數,即只能用於帶符號或無符號的char,short,int與long類型。

運算符 含義 描述

  • “&” 按位與 如果兩個相應的二進制位都爲1,則該位的結果值爲1,否則爲0
  • “|” 按位或 兩個相應的二進制位中只要有一個爲1,該位的結果值爲1
  • “^” 按位異或 若參加運算的兩個二進制位值相同則爲0,否則爲1
  • “~” 取反 ~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1變0
  • “<<” 左移 用來將一個數的各二進制位全部左移N位,右補0
  • “>>” 右移 將一個數的各二進制位右移N位,移到右端的低位被捨棄,對於無符號數,高位補0

1.與運算(&)

參加運算的兩個數據,按二進制位進行“與”運算。
運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;

   **即:兩位同時爲“1”,結果才爲“1”,否則爲0**

例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。

例如:9&5 即 0000 1001 (9的二進制補碼)&00000101 (5的二進制補碼) =00000001 (1的二進制補碼)可見9&5=1。

按位與的用途可以用來清零
原理:若想對一個存儲單元清零,即使其全部二進制位爲0,只要找一個二進制數,其中各個位符合一下條件
實現:原來的數中爲1的位,新數中相應位爲0。然後使二者進行&運算,即可達到清零目的。
例:原數爲43,即00101011(2),另找一個數,設它爲148,即10010100(2),將兩者按位與運算:
00101011(2)
&10010100(2)
00000000(2)

2.或運算(|)

參加運算的兩個對象,按二進制位進行“或”運算。
運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;

   **即 :參加運算的兩個對象只要有一個爲1,其值爲1。**

例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。

例如:9|5可寫算式如下: 00001001|00000101 =00001101 (十進制爲13)可見9|5=13
應用:
按位或運算常用來對一個數據的某些位定值爲1。例如:如果想使一個數a的低4位改爲1,則只需要將a與17(8)進行按位或運算即可。
交換兩個值,不用臨時變量。例如:a=3,即11(2);b=4,即100(2)
想將a和b的值互換,可以用以下賦值語句實現:
a=a∧b;
b=b∧a;
a=a∧b;
a=011(2)
(∧)b=100(2)
a=111(2)(a∧b的結果,a已變成7)
(∧)b=100(2)
b=011(2)(b∧a的結果,b已變成3)
(∧)a=111(2)

3.異或運算(^)

參加運算的兩個數據,按二進制位進行“異或”運算。
運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;

   **即:參加運算的兩個對象,如果兩個相應位爲“異”(值不同),則該位結果爲1,否則爲0。**

例如:9^5可寫成算式如下: 00001001^00000101=00001100 (十進制爲12)可見9^5

4、“取反”運算符(~)

他是一元運算符,用於求整數的二進制反碼,即分別將操作數各二進制位上的1變爲0,0變爲1。
運算規則:~2 = ~(0000 0010)= 1111 1101

5、左移運算符(<<)

左移運算符是用來將一個數的各二進制位左移若干位,移動的位數由左操作數指定(左操作數必須是非負值),其右邊空出的位用0填補,高位左移溢出則捨棄該高位。
運算規則:a=15<<2,即(0000 1111)<< 2,
左移後左邊兩位進制位捨棄,右邊補0;得到 0011 1100,即a=15*2^(2)=60;

#include <stdio.h>
main()
{
int a=15;
printf("%d",a<<2);
}

結論:左移1位相當於該數乘以2,左移2位相當於該數乘以2*2=4,15<<2=60,即乘了4。但此結論只適用於該數左移時被溢出捨棄的高位中不包含1的情況。

假設以一個字節(8位)存一個整數,若a爲無符號整型變量,則a=64時,左移一位時溢出的是0,而左移2位時,溢出的高位中包含1。

6、右移運算符(>>)

右移運算符是用來將一個數的各二進制位右移若干位,移動的位數由右操作數指定(右操作數必須是非負值),移到右端的低位被捨棄,對於無符號數,高位補0。對於有符號數,某些機器將對左邊空出的部分用符號位填補(即“算術移位”),而另一些機器則對左邊空出的部分用0填補(即“邏輯移位”)。

注意:對無符號數,右移時左邊高位移入0;對於有符號的值,如果原來符號位爲0(該數爲正),則左邊也是移入0。
如果符號位原來爲1(即負數),則左邊移入0還是1,要取決於所用的計算機系統。有的系統移入0,有的系統移入1。移入0的稱爲“邏輯移位”,即簡單移位;移入1的稱爲“算術移位”。

		例: a的值是八進制數113755: 
			 a:1001011111101101 (用二進制形式表示)
			 a>>1: 0100101111110110 (邏輯右移時)
			 a>>1: 1100101111110110 (算術右移時)
#include <stdio.h>
main()
{
int a=0113755;
printf("%d",a>>1);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章