[乾貨] 位運算面試題大總結

九章演算法發表於2017-03-28

專欄 | 九章演算法
網址 | www.jiuzhang.com

今天,九章演算法為大家悉心準備了史上最強的位運算知識點大總結!

1. 位運算基本操作知識小結

1.1 左移操作 a << b

將A的二進位制表示的每一位向左移B位,左邊超出的位截掉,右邊不足的位補0

A = 1100  B = 2
A << B = 110000複製程式碼

1.2 右移操作分為算數右移和邏輯右移

算術右移是帶符號的右移,邏輯右移是不帶符號的右移。

算術右移:將A的二進位制表示的每一位向右移B位,右邊超出的位截掉,左邊不足的位補符號位的數。

邏輯右移:將A的二進位制表示的每一位向右移B位,右邊超出的位截掉,左邊不足的位補0。

C語言:只有邏輯右移 A >> B

JAVA 和 Python中:算術右移 A >> B , 邏輯右移 A >>> B

A = 11111111111111111111111110000001
B = 2
A >> B = 11111111111111111111111111100000
A >>> B = 00111111111111111111111111100000複製程式碼

1.3 按位與操作 a & b

將A和B的二進位制表示的每一位進行與操作,只有兩個對應的二進位制位都為1時,結果位才為1,否則為0.

A = 001010
B = 101100
A & B = 001000複製程式碼

1.4 按位或操作 a | b

將A和B的二進位制表示的每一位進行或操作,只要兩個對應的二進位制位有一個為1,結果位就為1,否則為0.

A = 001010
B = 101100
A | B = 101110複製程式碼

1.5 按位非操作 ~ a

將A的二進位制表示每一位進行取反操作,如果對應的二進位制位為0,結果位為1,否則為0.

 A = 00000000000000000000000000001010
~A = 11111111111111111111111111110101複製程式碼

1.6 按位異或操作 a ^ b

將A和B的二進位制表示的每一位進行異或操作,如果對應的二進位制位不同,結果位為1,否則為0.

A = 001010
B = 101100
A ^ B = 100110複製程式碼

2. 應用實戰練習

2.1 應用一

給出兩個32位的整數N和M,以及兩個二進位制位的位置i和j。寫一個方法來使得N中的第i到j位等於M(M會是N中從第i為開始到第j位的子串)。

線上測試網址:www.lintcode.com/zh-cn/probl…
參考答案網址:www.jiuzhang.com/solutions/u…

思路解析:

根據題意,可以有一個想法,將n中第i位到第j位的先置為0,然後,按位或m << i即可。

現在問題是如何將n中第i位到第j位置為0,可以考慮構造一個數,這個數從第i位到第j位是0,其他位都為1。

這樣的數並不是很好構造,所以,我們構造一個數從第i位到第j位都是1,其他位為0的數,然後將這個數取反,就可以得到從第i位到第j位是0,其他位是1的數。

-1的二進位制表示是所有位為1,我們以這個數為起點。需要的做的是將高(31-j)位置0,將低i位置0。

將-1先左移(31-j)位,因為高(31-j)位都是不需要的。

然後再將((-1) << (31 - j))邏輯右移(31 - j + i)位,因為要將低i位置0.

然後再將(((-1) <<(31 - j)) >>> (31 - j + i))左移i位,將1恢復到正確的位置即可。即得到第i位到第j位是1,其他位是0的數。

[乾貨] 位運算面試題大總結

2.2 應用二

給出兩個整數a和b, 求他們的和, 但不能使用 + 等數學運算子。

線上測試網址:www.lintcode.com/zh-cn/probl…
參考答案網址:www.jiuzhang.com/solutions/a…

思路解析:
這裡引用九章演算法的答案:九章演算法LeetCode答案查詢

[乾貨] 位運算面試題大總結

3. 有用小技巧

3.1 技巧一

x & (x - 1) 用於消去x最後一位的1

x = 1100
x - 1 = 1011
x & (x - 1) = 1000複製程式碼

應用一

用 O(1) 時間檢測整數 n 是否是 2 的冪次。

線上測試網址:www.lintcode.com/zh-cn/probl…
參考答案網址:www.jiuzhang.com/solutions/o…

思路解析:
N如果是2的冪次,則N滿足兩個條件。

1.N >0
2.N的二進位制表示中只有一個1

因為N的二進位制表示中只有一個1,所以使用N & (N - 1)將N唯一的一個1消去,應該返回0。

[乾貨] 位運算面試題大總結

應用二

計算在一個 32 位的整數的二進位制表式中有多少個 1。

線上測試網址:www.lintcode.com/zh-cn/probl…
參考答案網址:www.jiuzhang.com/solutions/f…

思路解析:

由x & (x - 1)消去x最後一位的1可知。不斷使用 x & (x - 1) 消去x最後一位的1,計算總共消去了多少次即可。

[乾貨] 位運算面試題大總結

應用三

如果要將整數A轉換為B,需要改變多少個bit位?

線上測試網址:www.lintcode.com/zh-cn/probl…
參考答案網址:www.jiuzhang.com/solutions/f…

解題思路:
這個應用是上面一個應用的擴充。

思考將整數A轉換為B,如果A和B在第i(0<=i<32)個位上相等,則不需要改變這個BIT位,如果在第i位上不相等,則需要改變這個BIT位。所以問題轉化為了A和B有多少個BIT位不相同。聯想到位運算有一個異或操作,相同為0,相異為1,所以問題轉變成了計算A異或B之後這個數中1的個數。

[乾貨] 位運算面試題大總結

3.2 技巧二

使用二進位制進行子集列舉

應用

給定一個含不同整數的集合,返回其所有的子集。

線上測試網址:www.lintcode.com/zh-cn/probl…
參考答案網址:www.jiuzhang.com/solutions/s…

解題思路:

思路就是使用一個正整數二進位制表示的第i位是1還是0,代表集合的第i個數取或者不取。

所以從0到2^n-1總共2^n個整數,正好對應集合的2^n個子集。

S = {1,2,3}
N bit Combination
0 000 {}
1 001 {1}
2 010 {2}
3 011 {1,2}
4 100 {3}
5 101 {1,3}
6 110 {2,3}
7 111 {1,2,3}複製程式碼

[乾貨] 位運算面試題大總結

3.3 技巧三

a ^ b ^ b = a

應用一

陣列中,只有一個數出現一次,剩下都出現兩次,找出出現一次的數

線上測試網址:www.lintcode.com/en/problem/…
參考答案網址:www.jiuzhang.com/solutions/s…

思路解析:
因為只有一個數恰好出現一個,剩下的都出現過兩次,所以只要將所有的數異或起來,就可以得到唯一的那個數。

[乾貨] 位運算面試題大總結

應用二

陣列中,只有一個數出現一次,剩下都出現三次,找出出現一次的數

線上測試網址:www.lintcode.com/en/problem/…
參考答案網址:www.jiuzhang.com/solutions/s…

思路解析:

因為數是出現三次的,也就是說,對於每一個二進位制位,如果只出現一次的數在該二進位制位為1,那麼這個二進位制位在全部數字中出現次數無法被3整除。

膜3運算只有三種狀態:00,01,10,因此我們可以使用兩個位來表示當前位%3,對於每一位,我們讓Two,One表示當前位的狀態,B表示輸入數字的對應位,Two+和One+表示輸出狀態。

0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 1 0
1 0 1 0 0
One+ = (One ^ B) & (~Two)
Two+ = (~One+) & (Two ^ B)複製程式碼

[乾貨] 位運算面試題大總結

應用三

陣列中,只有兩個數出現一次,剩下都出現兩次,找出出現一次的數

線上測試網址:www.lintcode.com/en/problem/…
參考答案網址:www.jiuzhang.com/solutions/s…

思路解析:

有了第一題的基本的思路,我們可以將陣列分成兩個部分,每個部分裡只有一個元素出現一次,其餘元素都出現兩次。那麼使用這種方法就可以找出這兩個元素了。

不妨假設出現一個的兩個元素是x,y,那麼最終所有的元素異或的結果就是res = x^y。並且res!=0,那麼我們可以找出res二進位制表示中的某一位是1。對於原來的陣列,我們可以根據這個位置是不是1就可以將陣列分成兩個部分。x,y在不同的兩個子陣列中。而且對於其他成對出現的元素,要麼在x所在的那個陣列,要麼在y所在的那個陣列。

[乾貨] 位運算面試題大總結

美帝程式碼搬運工,資深面試官,微信公眾號 ninechapter, 定期分享技術乾貨

[乾貨] 位運算面試題大總結
九章演算法,IT教育領域的深耕者



歡迎關注我的微信公眾號:九章演算法(ninechapter)。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等

[乾貨] 位運算面試題大總結
九章演算法,IT教育領域的深耕者

相關文章