位運算及其編程妙用

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

特性

  1. 左移和右移操作符不能用在負數上。如果兩個操作數其中一個爲負數,將會導致undefined行爲。如-1<<1 或1<<-1.而且,如果移動的位數超過數的範圍,也會導致undefined行爲。如1<<33. 出錯。
  2. 從面試上說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;
}
  1. 位操作符不能用來替換邏輯運算符。邏輯運算符(&&,||,和!)運算結果爲0或1.但位操作符運算結果爲整數。而且邏輯運算符將任意非0值視爲1.
  2. 左移和右移分別等價於乘2和除以2.
  3. & 運算符可以用來快速檢測一個數的奇偶性. x & 1表達式的值如果非0,則x是奇數;反之爲偶數。
int main(){
    int x = 19;
    (x & 1)? printf("Odd"):printf("Even");

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章