Bitwise Operators
介紹
位操作符通常用來對操作數進行位級的操作運算。首先將運算符轉換爲位級,然後對操作數執行計算。可以在比特級執行諸如加法,減法,乘法等的數學運算以便更快地處理。
在C語言中,有6種位操作符(在比特級運算)。
- &(bitwise AND):與。兩個操作數,在兩個操作數上的每個比特上進行AND操作。只有兩個比特都是1時,運算結果纔是1。
- |(bitwise OR):或。兩個操作數,在兩個操作數上的每個比特上進行OR操作。只要有一個比特爲1,運算結果爲1。
- ~(bitwise NOT):非。單元操作符。只要一個操作數。翻轉比特位-0變1,1變0.
- ^(bitwise OXR):異或。兩個操作數。在兩個操作數上的每個比特上進行XOR操作。如果兩個比特位不相同,運算結果爲1.
- <<(left shift):左移。兩個操作數。要左移的數以及左移的位數。
- (right shift):右移。兩個操作數。要右移的數以及右移的位數。
#include<stdio.h>
int main()
{
unsigned char a = 5, b = 9; // a = 5(00000101), b = 9(00001001)
printf("a = %d, b = %d\n", a, b);
printf("a&b = %d\n", a&b); // The result is 00000001
printf("a|b = %d\n", a|b); // The result is 00001101
printf("a^b = %d\n", a^b); // The result is 00001100
printf("~a = %d\n", a = ~a); // The result is 11111010
printf("b<<1 = %d\n", b<<1); // The result is 00010010
printf("b>>1 = %d\n", b>>1); // The result is 00000100
return 0;
}
運算結果:
a = 5, b = 9
a&b = 1
a|b = 13
a^b = 12
~a = 250
b<<1 = 18
b>>1 = 4
特性
- 左移和右移操作符不能用在負數上。如果兩個操作數其中一個爲負數,將會導致undefined行爲。如-1<<1 或1<<-1.而且,如果移動的位數超過數的範圍,也會導致undefined行爲。如1<<33. 出錯。
- 從面試上說XOR異或操作是最常見的知識點。主要性質:任意數和自身異或結果爲0;0和任意數n異或結果還是本身n.
eg:“Given a set of numbers where all elements occur even number of times except one number, find the odd occurring number.”給一個數組,數組元素除了一個元素外都出現偶數次,找到出現奇數次的元素。
int findOdd(int arr[], int n)
{
int res = 0,i;
for(i=0;i<n;i++)
res ^= arr[i];
return res;
}
- 位操作符不能用來替換邏輯運算符。邏輯運算符(&&,||,和!)運算結果爲0或1.但位操作符運算結果爲整數。而且邏輯運算符將任意非0值視爲1.
- 左移和右移分別等價於乘2和除以2.
- & 運算符可以用來快速檢測一個數的奇偶性. x & 1表達式的值如果非0,則x是奇數;反之爲偶數。
int main(){
int x = 19;
(x & 1)? printf("Odd"):printf("Even");
return 0;
}