筆試中常見的位運算案例分析

2021-08-27 20:18:07 字數 1157 閱讀 8459

參考博文  :

輸入乙個數字,然後計算出它二進位制中'1'的個數。此方法相對於使用自帶的string庫,把空間節約到了o(1)。

static int bitcount(int n) 

return count;

}

獲取x中0到16位的低位值

x = x & 0xffff;
獲取16~32位的值

x = (x >> 16 ) & 0xffff;
求相反數 // 取反+1

i = (i ^ -1) + 1;
求絕對值

證明 :

先移位來取符號位,int i = a >> 31;要注意如果a為正數,i等於0,為負數,i等於-1。然後對i進行判斷——如果i等於0,直接返回。否之,返回~a+1。

//by morewindows(  )  

int my_abs(int a)

或者 因為 x >>31 只可能我0或-1 可能你會覺得-1右移31不會是1嗎,怎麼變成了-1了,因為負數右移的時候,左邊填充的不是0而是1!!

1. 與0相異或,不變 如果x是正數的話,不變

2. 與-1(oxffff) 相異或,相當於取反,以為為1的地方變成了0,為0的地方變成了1 ,然後+1

i = (x ^ (x >> 31)) - (x >> 31);
交換

void swap(int a,int b)
證明:

第一步  a^=b 即a=(a^b);

第二步  b^=a 即b=b^(a^b),由於^運算滿足交換律,b^(a^b)=b^b^a。由於乙個數和自己異或的結果為0並且任何數與0異或都會不變的,所以此時b被賦上了a的值。

第三步 a^=b 就是a=a^b,由於前面二步可知a=(a^b),b=a,所以a=a^b即a=(a^b)^a。故a會被賦上b的值。

有關面試中常見位運算總結

int numberof 1 int n return count int is 2n int n 1 求這兩個數的異或 兩個數不同的位置都為1,這些位置都需要改變 2 統計異或結果中1的個數 int stepchangeto int m,int n int add int num1,int num...

面試中常見的位運算題目

a 11111111111111111111111110000001 b 2 a b 11111111111111111111111111100000 a b 00111111111111111111111111100000 題目 給出乙個整數n,求其二進位制表示中1的個數。思路 1.每次根據技巧一...

常見的位運算

計算機中的數在記憶體中都是以二進位制形式進行儲存的,用位操作就是直接對整數在記憶體中的二進位制位進行操作,因此其執行效率非常高,在程式中盡量使用位運算進行操作,這會大大提高程式的效能。位操作是各大網際網路公司面試經常會問的一類問題。int a 8 a 3 移位前 0000 0000 0000 000...