位運算面試題總結

2021-07-28 09:09:34 字數 2430 閱讀 5185

題目鏈結

題目描述

給出兩個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)2

class

solution

else

mask = (1

<< i) - 1;

return (m << i) + (n & mask);

}};

題目鏈結

題目描述:給出兩個整數a和b, 求他們的和, 但不能使用 + 等數**算符。

主要利用異或運算來完成

異或運算有乙個別名叫做:不進製加法,那麼a ^ b就是a和b相加之後,該進製的地方不進製的結果,然後下面考慮哪些地方要進製,自然是a和b裡都是1的地方,a & b就是a和b裡都是1的那些位置,a & b << 1 就是進製之後的結果。所以:a + b = (a ^ b) + (a & b << 1),令a』 = a ^ b, b』 = (a & b) << 1,可以知道,這個過程是在模擬加法的運算過程,進製不可能一直持續,所以b最終會變為0。

class solution 

return a;

}};

題目鏈結

如果n是2的冪數

n > 0

n的二進位制數中只有乙個1

class solution 

};

題目鏈結

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

class

solution

return times;

}};

題目鏈結

可以轉化為a^b中1的個數

class

solution

return ret;

}};

題目鏈結

利用 a ^ b ^ b = a

class solution 

int ret = a[0];

for (int i = 1; i< size; i++)

return ret;

}};

題目鏈結

class solution ;//統計每一位中1的個數

for (int i = 0; i < size; i++) }}

int ret = 0;

for (int i = 31; i >= 0; i--)

return ret;

}};

題目鏈結

求二進位制中最後一位1的個數

原碼,二進位制表示

反碼,正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反

補碼,正數的補碼就是原碼,負數的補碼是反碼 + 1

在計算機中都是採用補碼的形式儲存

所以,a&-a就是a最後一位1的位置

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

class solution ;

if (size == 0)

int diff = a[0];

for (int i = 1; i < size; i++)

diff &= -diff;

for (int i = 0; i < size; i++)

else

}return ret;

}};

給乙個很長的二進位制字串,計算除以3的餘數

奇數字除以3餘1,偶數字除以3餘2,所以

奇數字1的個數等於偶數字1的個數,則餘數為0

奇數字個數大於偶數字,個數相減後 %3

偶數字個數大於奇數字,個數相減後*2%3

int fun(char* s, int len) 

times++;

}if(odd_num > even_num)

return (odd_num-even_num)%3;

else

return (odd_num - even_num) * 2 % 3;

}int main()

位運算常見面試題

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

位運算面試題常用技巧

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

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 錯誤 如下 有符號數會造成...