老實說,我對+ = * / % && || ==一些比較簡單的運算子比較熟悉。對位運算就陌生了,主要用的少。我覺得高手用的會比較多,因為位運算速度比較快。
1.&
如果兩個相應的二進位制位都為1,則該位的結果值為1;否則為0。
注:下面都用8位的 unsigned char 來做例子。
11&3 = 3
00001011
& 00000011
= 00000011 = 3
比如我們經常要用的是否被2整除,一般都寫成 if(n % 2 == 0)
可以換成 if((n&1) == 0)
如果兩個相應的二進位制位只要有乙個是1,結果就是1;否則為0。
11 | 3 = 11
00001011
| 00000011
= 00001011 = 11
可以用乙個unsigned int 來儲存多個布林值。比如乙個檔案有讀許可權,寫許可權,執行許可權。看起來要記錄3個布林值。我們可以用乙個unsigned int也可以完成任務。
乙個數r來表示讀許可權,它只更改個位來記錄讀許可權的布林值
00000001 (表示有讀許可權)
00000000 (表示沒有讀許可權)
乙個數w表示寫許可權,它只用二進位制的倒數第二位來記錄布林值
00000010 (表示有寫許可權)
00000000 (表示沒有寫許可權)
乙個數x表示執行許可權,它只用倒數第三位來記錄布林值
00000100 (表示有執行許可權)
00000000 (表示沒有執行許可權)
那麼乙個檔案同時沒有3種許可權就是
~r | ~ w | ~ x 即為 00000000,就是0
只有讀的許可權就是
r | ~w | ~x 即為 00000001,就是1
只有寫的許可權就是
~r | w | ~x 即為 00000010,就是2
...乙個檔案同時有3種許可權就是
r | w | x 即為 00000111,就是7
《簡單例子(向左移一位,右邊自動補0)
11 << 1 = 22
00001011 << 1
00010110 = 22
相當於二進位制的每個數都變成當前值的兩倍,結果就是變成當前值的兩倍。
n * 2 == (n << 1)
推廣下就是(注意可能會溢位)
>>簡單例子(向右移一位,左邊自動補1)
11 >> 1 = 5
00001011 >> 1
00000101 = 5
注意到最後一位的1被乾掉了。
比較實用的例子是:
int n = n / 2 等價於 int n = n >> 1 等價於 int n >>= 1
兩個相同的數會變成0,反之是1
例子:11^3 = 8
00001011
^ 00000011
= 00001000 = 8
我覺得理解異或,一定要用異或來解下面的題目:
就是乙個陣列中,所有數字都出現了兩次,只有乙個沒有
比如 int t = 要找到5。
用異或就完美了,所有相同的都會消失,留下來的就是5了。我發現異或是嫉妒成雙成對的。
int singlenumber(int a, int n)
return a[0];
}
還有就是用不tmp值來交換兩個數
//不用temp交換兩個整數
void swap(int& x , int& y)
扯點別的,^在lua中表示pow的意思,這是要逆天。
這個在加法中用到
x-y = x + ~y + 1
所以~y = - y -1
比如 ~11 = -11 -1 = -12
居然有道題目是這樣的: 求 100 % 8的 優化解法。我們知道:
8剛好是2的3次方
所以 100 % 8 == 100 - math.floor(100 / 8) * 8 == 100 - ((100 >> 3) << 3)
總的來說比較低,一定要加括號。
位運算基礎及簡單應用
程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。含義c語言 操作按位與 a b 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 按位或a b 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 按位異或 a b 若參加運...
位運算及應用
位運算 與 或 非 異或 左移,相當與 2 右移,正數高位補0,負數由計算機決定 右移,正數高位補0,負數亦補0 迴圈左移k次 x 32 k 迴圈右移k次 x k x 32 k 清零取反要用與,某位置一可用或 若要取反和交換,輕輕鬆鬆用異或 應用 字元改變大小寫 原理 小寫字元比對應的大寫字元在數值...
位運算應用
位運算 針對整型 字元型,計算機會將它轉換為二進位制運算 1 按位與 x y 對應位都為1時才為1 用途 取 保留1個數的某位 對應掩碼的對應位為1 其餘各位置1 2 按位或 x y 對應位都為0才為0,否則為1 用途 將1個數的某些位置1,其餘不變 3 按位異或 x y 對應位相同為0,不同為1 ...