研究這個的起因是我遇到一個題目,判斷一個數是奇偶數,這個很簡單,但是又個最佳代碼 判斷奇偶時用了
#include
int main()
{ int n;
scanf("%d",&n);
printf("%s",n&1?"odd":"even");
}
這里用&運算,從而判斷二進制數的最后一位是否為當n的最后一位=0.和1& 則為 0 。只有當n = 1 則 &為 1 再根據?:表達式的運算讓1為真輸出odd0為假為偶輸出even。
現在來詳細整理下這些運算。
位運算 位運算的運算分量只能是整型或字符型數據,位運算把運算對象看作是由二進位組成的位串信息,按位完成指定的運算,得到位串信息的結果。
位運算符有: &(按位與)、|(按位或)、^(按位異或)、~ (按位取反)。
~取反為單目,其余都是雙目運算符。
優先級 ~ > 算術運算符(+-*/) > & > ^ > | ;
運算符 含義 描述
& 按位與 如果兩個相應的二進制位都為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 是1是真,其余都0 為假;
(這里的0 1 是二進制中的按位取與 )
3 = 00000011
5 = 00000101
3&5= 00000001 =1
(2)按位或運算符
(|) 按位或運算將兩個運算分量的對應位按位遵照以下規則進行計算:
0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
即只要有1個是1的位,結果為1,否則為0。
例如,023 | 035 結果為037。
按位或運算的典型用法是將一個位串信息的某幾位置成1。如將要獲得最右4為1,其他位與變量j的其他位相同,可用邏輯或運算017|j。若要把這結果賦給變量j,可寫成: j = 017|j
(3)按位異或運算符(^) 按位異或運算將兩個運算分量的對應位按位遵照以下規則進行計算: 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0 即相應位的值相同的,結果為 0,不相同的結果為 1。 例如,013^035結果為026。
異或運算的意思是求兩個運算分量相應位值是否相異,相異的為1,相同的為0。按位異或運算的典型用法是求一個位串信息的某幾位信息的反。如欲求整型變量j的最右4位信息的反,用邏輯異或運算017^j,就能求得j最右4位的信息的反,即原來為1的位,結果是0,原來為0的位,結果是1。 (4)按位取反運算符(~) 按位取反運算是單目運算,用來求一個位串信息按位的反,即哪些為0的位,結果是1,而哪些為1的位,結果是0。例如, ~7的結果為0xfff8。 取反運算常用來生成與系統實現無關的常數。如要將變量x最低6位置成0,其余位不變,可用代碼x = x & ~077實現。以上代碼與整數x用2個字節還是用4個字節實現無關。 當兩個長度不同的數據進行位運算時(例如long型數據與int型數據),將兩個運算分量的右端對齊進行位運算。如果短的數為正數,高位用0補滿;如果短的數為負數,高位用1補滿。如果短的為無符號整數,則高位總是用0補滿。 位運算用來對位串信息進行運算,得到位串信息結果。如以下代碼能取下整型變量k的位串信息的最右邊為1的信息位:((k-1)^k) & k。
移位運算 移位運算用來將整型或字符型數據作為二進位信息串作整體移動。
有兩個運算符: << (左移) 和 >> (右移) 移位運算是雙目運算,有兩個運算分量,左分量為移位數據對象,右分量的值為移位位數。
移位運算將左運算分量視作由二進位組成的位串信息,對其作向左或向右移位,得到新的位串信息。 移位運算符的優先級低於算術運算符,高於關系運算符,它們的結合方向是自左至右。
(1)左移運算符(<<) 左移運算將一個位串信息向左移指定的位,右端空出的位用0補充。例如014<<2,結果為060,即48。 左移時,空出的右端用0補充,左端移出的位的信息就被丟棄。在二進制數運算中,在信息沒有因移動而丟失的情況下,每左移1位相當於乘2。如4 << 2,結果為16。
(2)右移運算符(>>) 右移運算將一個位串信息向右移指定的位,右端移出的位的信息被丟棄。例如12>>2,結果為3。與左移相反,對於小整數,每右移1位,相當於除以2。在右移時,需要注意符號位問題。對無符號數據,右移時,左端空出的位用0補充。對於帶符號的數據,如果移位前符號位為0(正數),則左端也是用0補充;如果移位前符號位為1(負數),則左端用0或用1補充,取決於計算機系統。對於負數右移,稱用0 補充的系統為“邏輯右移”,用1補充的系統為“算術右移”。以下代碼能說明讀者上機的系統所采用的右移方法:
printf("%d\n\n\n", -2>>4); 若輸出結果為-1,是采用算術右移;輸出結果為一個大整數,則為邏輯右移。 移位運算與位運算結合能實現許多與位串運算有關的復雜計算。設變量的位自右至左順序編號,自0位至15位,有關指定位的表達式是不超過15的正整數。
位運算賦值運算符 位運算符與賦值運算符可以組成復合賦值運算符。 例如: &=, |=, >>=, <<=, ∧=
例: a & = b相當於 a = a & b
a << =2相當於a = a << 2