面試經驗(3) 位運算技巧

2021-08-16 20:16:42 字數 2212 閱讀 1704

1、左移操作符

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

a = 1100 b = 2

a << b = 110000

2、右移操作 a >> b

c語言:只有邏輯右移 a >> b

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

a >> b = 11111111111111111111111111100000

3、按位與操作 a & b

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

a = 001010

b = 101100

a & b = 001000

4、按位或操作 a | b

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

a = 001010

b = 101100

a | b = 101110

5、按位非操作 ~ a

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

a = 00000000000000000000000000001010

~a = 11111111111111111111111111110101

6、按位異或操作 a ^ b

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

a = 001010

b = 101100

a ^ b = 100110

1、技巧一

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

x = 1100

x - 1 = 1011

x & (x - 1) = 1000

應用一

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

思路解析:

n如果是2的冪次,則n滿足兩個條件。

1.n >0

2.n的二進位制表示中只有乙個1

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

應用二

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

思路解析:

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

應用三

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

解題思路:

這個應用是上面乙個應用的拓展。

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

2、技巧二

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

應用一

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

解題思路:

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

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

s =

n bit combination

0 000 {}

1 001

2 010

3 011

4 100

5 101

6 110

7 111

3、技巧三

a ^ b ^ b = a

應用一

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

思路解析:

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

面試經驗技巧

三段式 場景 任務,行動,結果 勇於提問 高效設計 偽 先行 控制節奏 規範編碼 精心測試 例如,面試官可能會問這樣乙個問題 請你估算一家商場在 時一天的營業額 求職者如何能夠得出乙個準確的資料呢?其實本題只要能夠分析出乙個概數就行了,不一定要得出精確資料,而分析概數的前提就是做出各種假設。以該問題...

位運算面試題常用技巧

位運算是面試中的常見考題一種,位操作有 六種。左移和右移規則 對左移而言,移動正數和負數規則是相同的 對於右移而言,則有些差別,正數補0,負數補1。舉例說明 對於乙個16位的整數 0000 0000 0000 0101,左移一位是0000 0000 0000 1010,右移一位是0000 0000 ...

位運算技巧

1.lowbit x 實現 int lowbit int x 這個函式用來求數中二進位制位中最低位的1 完整求法 log2 lowbit x 需要注意的是,答案的範圍是0 30,因為31位是符號位,求出來的值為負數,原因如下 設x 0x8000 0000,那麼設res lowbit x 0x8000...