主要講解c++的位運算和位運算的作用。
表示按位與:
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
用處:
保留某一位,用於判斷對應位資料是否為1。
int a = 0x00101101;
//判斷低三位是否為1
if(a & 0x100 == 0x100)
使用0x0f來與乙個整數進行&運算,來獲取該整數的最低4個bit位。
int a = 0xa7;
int b = a & 0x0f; //b = 0x07
判斷是否被2整除,即判斷是否為偶數。
int a = 7;
if(a & 1 != 1)
乙個數如果是奇數,就變成偶數,如果是偶數則不變,需要配置~符號使用。
int a = 5;
a = a & ~ 0x01;//a = 4
a = 6;
a = a & ~ 0x01;//a = 6
表示按位或:
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
用處:
設定指定位的資料,不管指定位是否為1.
int a = 0x0101;
int b = a | 0x10; //b = 0x0111;
按位異或運算,即相應位的值相同的,結果為 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] = ;
//這裡需要賦值
//......
int res = 0;
for(int i = 0; i < 100; i++)
}if(res == 0)
else
還有類似題目:
寫乙個函式,求兩個整數的之和,要求在函式體內不得使用+、-、×、÷。
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字以及條件判斷語句(a?b:c)。
按位取反運算是單目運算,用來求乙個位串資訊按位的反,即哪些為0的位,結果是1,而哪些為1的位,結果是0。
~1 = 0
~0 = 1
~0x01 = 0xfe
暫時寫到這裡,下次繼續寫。
數值轉換成二進位制後,按位左移(右移),同時補零,移位運算子要注意的是帶不帶符號移位,分為有符號移位操作和無符號移位操作。
4 >> 1 = 2
4 >> 2 = 1
4 >> 3 = 0
4 << 1 = 8
4 << 2 = 16
4 << 3 = 32
0010 >> 1 = 0001
0100 << 1 = 1000
0010 >> 2 = 0000
0100 << 2 = 0000
作用:
乘以2的倍數,除以2的倍數,左移是乘移2的倍數,右移是除以2的倍數,(當然要注意資料是否超過了上限)。
int a = 4;
int b = a * 2; //b = 4
int c = a << 1; //b = 4
C 位運算總結
位運算應用口訣 清零取反要用與,某位置一可用或 若要取反和交換,輕輕鬆鬆用異或 移位運算 要點 1 它們都是雙目運算子,兩個運算分量都是整形,結果也是整形。2 左移 右邊空出的位上補0,左邊的位將從字頭擠掉,其值相當於乘2。3 右移 右邊的位被擠掉。對於左邊移出的空位,如果是正數則空位補0,若為負數...
C 位運算總結
位運算的運算物件只能是整型或者字元型資料。c 的位運算子 c 中的移位運算 移位運算是指將二進位制資訊串作為整體移動。leetcode上位運算的幾道例題 1 位異或運算 異或運算 相同為0,不同為1。將陣列中的所有元素求異或和,對於相同的元素,異或的結果為0。因此,陣列中成對出現的元素異或和為0,所...
位運算總結
位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...