C++ 位運算總結(一)
阿新 • • 發佈:2018-12-19
主要講解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
暫時寫到這裡,下次繼續寫。