一文讀懂位運算
- 2021 年 9 月 26 日
- 筆記
概述
在電腦程式中所有的數都是以二進位形式存儲的。位運算就是直接對整數在二進位進行計算操作。作為一名程式設計師掌握位運算的基本使用是很重要的,而對於演算法程式設計師來說,位運算的靈活使用能夠更靈活高效的解決很多問題。
位運算都有哪些
符號 | 描述 | 運算規則 |
---|---|---|
& | 與 | 同為1時結果為1,其它為0 |
| | 或 | 同為0時結果為0,其它為1 |
^ | 異或 | 相同為0,不同為1 |
~ | 取反 | 0變1,1變0 |
<< | 左移 | 各位左移,高位丟棄,低位補0 |
>> | 右移 | 各位右移,低位丟棄,如果該數為正則高位補0;反之補1 |
>>> | 無符號右移 | 又稱邏輯右移,不管正負,高位補0 |
運算符邏輯
按為與(&)
參加運算的兩個數按二進位進行與運算。
0&0=0
0&1=0
1&1=1
用途:
清零
任何數與0做與運算結果都為0。
取指定位
比如要取一個數的低4位,則只需使用該數與(0000 1111)做與運行,結果就是這個數的低4位的值。
奇偶判斷
只要二進位的末尾為0則是偶數,為1則為奇數。因此可用 (x&1)==0
判斷是否是偶數。
按位或(|)
參加運算的兩個數按二進位進行或運算。
0|0=0
0|1=1
1|1=1
用途:
將某位設置為1
如X=0101,需要將第2位設置為1,結果變為0111,則只需和(0010)進行或運算,0101|0010=0111。
按位異或(^)
參加運算的兩個數按二進位進行異或運算。
0^0=0
0^1=1
1^1=0
用途:
翻轉指定位
如要將X=0101 1010的低4位翻轉為0101,則只需和Y=0000 1111進行異或運行,X^Y=0101 0101 。
交換兩數值
如X=0101,Y=0100,需要將X和Y的值進行交換。
x ^= y; // x= 0101 ^ 0100 = 0001
y ^= x; // y = 0100 ^ 0001 = 0101
x ^= y; // x = 0001 ^ 0101 = 0100
按位取反(~)
參加運算的1個數據各位值0變1,1變0.
~0101=1010
用途:
取反運算和用於快速獲得某個特定值,如獲取一個最低位為0其他位為1的數,則對1進行取反即可,~1。
左移運算符(<<)
參與運算的1個數據各位左移,高位丟棄,低位補0。
0101 << 1 = 1010
如果左移的數最高位不等於1,則相當於乘2。
右移運算符(>>)
參與運算的1個數據各位右移,如果該數為正則高位補0,反之補1,低位丟棄。
0101 >> 1 = 0010
某數進行右移運算相當於除以2。
無符號右移運算符(>>>)
又稱邏輯右移,不管正負,高位補0。
0101>>>1=0010
如負數-5
進行右移操作,結果如下。(-5的二進位表示為11111111111111111111111111111011)
11111111111111111111111111111011>>>1=01111111111111111111111111111101
註:負數的二進位表示形式為補碼。
有哪些騷操作
技巧一
x & (x – 1) 用於消去x最後一位的1
應用:檢測整數x是否是2的次冪
思路:2的次冪滿足以下條件:
- 大於0
- 只有1個位是1
則x & (x – 1)的結果如果等於0則表示x是2的次冪。
技巧二
a ^ b ^ b = a
一個數據集合中,只有1個數字出現1次,其他數字都出現兩次,找出這個數。
思路:只需要將所有數據進行異或運算,結果就是這個數。
一個數據集合中,只有2個數字出現過1次,其他數字都出現過兩次,找出這兩個數。
思路:假設這兩個數是X,Y,所有數字進行異或的結果就是X^Y,因為異或運算邏輯是相同為0,不同為1,則找出這個結果的二進位中等於1的位置,然後將所有數字按照該位是否為1分成兩部分,那麼X和Y會被分開,然後分別做異或運算,結果便是X和Y.
小結
位運算在各大互聯網公司的面經中經常會出現,各種演算法題中也高頻使用,希望本文能讓你對位運算有一個初步的認識。
來都來了,點個贊再走啦~