位運算是面試中的常見考題一種,位操作有~, <<, >>, &, |, ^六種。
左移和右移規則
對左移而言,移動正數和負數規則是相同的;對於右移而言,則有些差別,正數補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 錯誤 如下 有符號數會造成...