位運算面試題常用技巧

2021-09-05 08:19:27 字數 1793 閱讀 5581

位運算是面試中的常見考題一種,位操作有~, <<, >>, &, |, ^六種。

左移和右移規則

對左移而言,移動正數和負數規則是相同的;對於右移而言,則有些差別,正數補0,負數補1。 

舉例說明: 

對於乙個16位的整數:0000 0000 0000 0101,左移一位是0000 0000 0000 1010,右移一位是0000 0000 0000 0010 

對於乙個16位的負數:1000 0000 0000 0101,左移一位是0000 0000 0000 1010,右移一位是1100 0000 0000 0010

下面通過幾個典型的題目來透徹分析位運算的一些常用技巧。

技巧一:

對於正整數,左移一位,就是將數值乘2;右移一位就運算數值除2;但是位操作的效率要比運算子高。

技巧二:

乙個數和另乙個數異或兩次得到的還是原來的數

題:不用臨時變數交換兩個整數。

a = a ^ b;

b = a ^ b;

a = a ^ b;

技巧三:

n & (n - 1)將整數n的最後一位為1的位變成0

題:統計乙個整數中二進位制位上1的個數。

int fun(int num)

return count;

}題:判斷乙個數是不是2的冪。

//返回0表示是2的冪,返回非0值表示不是2的冪

int fun(int num)

解析:如果乙個數是2的冪,則其有且只有一位為1。因此,消除這一位後就會變成0

題:判斷乙個32位整數是不是4的冪

//返回0表示不是4的冪,返回非0表示是4的冪

int fun(int num)

return 0;

}解析:是4的冪的數一定是2的冪,因此先判斷是不是2的冪,2的冪中1在基數字上的是4的冪,與0x55555555按位與,如果在基數字上有數則不為0

題:輸入兩個整數m和n,計算需要改變多少位能使m變成n

int fun(int m, int n)

return count;

}技巧四:

n & (~n + 1)提取出整數n最後一位為1的數 

舉例:n = 01101,~n是將n按位取反就是10010,~n + 1 = 10011,最後,n & (~n + 1) = 00001

題:統計乙個整數中二進位制位上1的個數。

int fun(int num)

return count;

}技巧五:

不使用+,-,*,/完成整數相加

int add(int num1, int num2)

while(num2 != 0); //將結果相加的過程就重複上述過程,直到進製為0

return sum;

}舉例分析**過程: 

將12(二進位制表示為0000 1100)與5(二進位制表示為0000 0101)相加

第一次迴圈: 

0000 1100 ^ 0000 0101 = 0000 1001 

(0000 1100 & 0000 0101) << 1 = 0000 1000

第二次迴圈: 

(0000 1001 ^ 0000 1000) = 0000 0001 

(0000 1001 & 0000 1000) << 1 = 0001 0000

第三次迴圈: 

(0000 0001 ^ 0001 0000) = 0001 0001 

(0000 0001 & 0001 0000) << 1 = 0000 0000

迴圈結束 

結果為0001 0001 = 17

位運算面試題總結

題目鏈結 題目描述 給出兩個32位的整數n和m,以及兩個二進位制位的位置i和j。寫乙個方法來使得n中的第i到j位等於m m會是n中從第i為開始到第j位的子串 樣例n 10000000000 2,m 10101 2,i 2,j 6 返回n 10001010100 2class solution els...

位運算常見面試題

思路 兩個相同數異或結果為0 int a a b int b a b int a a b 思路 兩個相同數異或結果為0,讓陣列中所有的數字相異或,留下的結果即為出現 次的數字 int find one time number vector data return result 思路 兩個相同數異或結...

C語言面試題分類 位運算

1.不用臨時變數交換兩個整數。a a b b a b a a b 2.實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如9的二進位制是1001,則輸出2。int check count fun int number return count int main 錯誤 如下 有符號數會造成...