1. 程式人生 > >C++ 位運算總結(一)

C++ 位運算總結(一)

    主要講解C++的位運算和位運算的作用。

1.按位與(&)

    表示按位與:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

用處:

    保留某一位,用於判斷對應位資料是否為1。

int a = 0x00101101;
//判斷低三位是否為1
if(a & 0x100 == 0x100){
    //第三位為1
}

    使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位。

int a = 0xa7;
int b = a & 0x0f;  //b = 0x07

    判斷是否被2整除,即判斷是否為偶數。

int a = 7;
if(a & 1 != 1){
    //偶數
} 

2.按位或(|)

    表示按位或:

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

用處:

    設定指定位的資料,不管指定位是否為1.

int a = 0x0101;
int b = a | 0x10; //b = 0x0111;

3.按位異或(^)

    按位異或運算,即相應位的值相同的,結果為 0,不相同的結果為 1。

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

    這裡要注意,不論什麼一個數字異或它自己都等於0。也就是說。假設我們從頭到尾依次異或陣列中的每個數字,那麼終於的結果剛好是那個僅僅出現一次的數字。由於那些出現兩次的數字所有在異或中抵消掉了。

用處:

    交換數值。

int a = 18;
int b = 57;
a = a ^ b;
b = a ^ b;
a = a ^ b;
//a = 57, b = 18

    解決特定例子:

//給定大小是N的陣列,數組裡的元素互相不反覆,元素的大小範圍是1~(N+1)。
//目標是找出第一個miss的數。要求時間複雜度O(N)。空間是O(1)。
    int result = 0;//結果
    //假設是一百,具體自設
    int array[100] = {0};
    //這裡需要賦值
    //......
    int res = 0;
    for(int i = 0; i < 100; i++) {
        res ^= (i + 1);
        if(array[i] <= 100) {
            res ^= array[i];
        }
    }
    if(res == 0){
        result = 101;
    }
    else{
        result = res;
    }

    還有類似題目:

        寫一個函式,求兩個整數的之和,要求在函式體內不得使用+、-、×、÷。         求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字以及條件判斷語句(A?B:C)。

4.按位取反運算子(~)

    按位取反運算是單目運算,用來求一個位串資訊按位的反,即哪些為0的位,結果是1,而哪些為1的位,結果是0。

~1 = 0
~0 = 1
~0x01 = 0xfe

    暫時寫到這裡,下次繼續寫。