概述
在計算機程式中所有的數都是以二進制形式存盤的,位運算就是直接對整數在二進制進行計算操作,作為一名程式員掌握位運算的基本使用是很重要的,而對于演算法程式員來說,位運算的靈活使用能夠更靈活高效的解決很多問題,
位運算都有哪些
| 符號 | 描述 | 運算規則 |
|---|---|---|
| & | 與 | 同為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.
小結
位運算在各大互聯網公司的面經中經常會出現,各種演算法題中也高頻使用,希望本文能讓你對位運算有一個初步的認識,
來都來了,點個贊再走啦~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/303174.html
標籤:其他
上一篇:Maven-基本配置
