面試題10 二進位制中1的個數

2021-07-12 04:08:43 字數 824 閱讀 8853

此題考查的是對位運算的掌握,題目不是很難,但一些細節問題還是需要注意的。

方法1:移位

我們把這個數和0x1相與,如果結果為0,則表明該數的最後移位為0,否則為1。然後將這個數右移1位在此判斷,迴圈32次。

**如下:

int numberof1(int n)

n>>=1;

}return count;

}

以上我們採用了右移來計算1的個數。不過當計算機使用邏輯右移的時候,n最終會變成oxffffffff,導致死迴圈。

對於無符號數,左移和右移都是在相應的位上補0;而對於有符號數,左移是在最低位補0,而右移到底是採用算術右移還是邏輯右移,c標準並沒有明確規定。不過大多數機器上使用的是算數右移,所以以上**可以很好地工作。但你能保證不會遇到例外情況嗎?

解決辦法就是使用左移,或使n不動,移動1即可。

**如下:

int numberof1(int n)

flag=flag<<1;

}return count;

}

然而更好的解決辦法是:

當n不為0時,n&(n-1)就相當於去掉了其二進位制中的最後一位1。比如n為9,二進位制位1001,n-1=8,二進位制位1000,兩者相與結果為1000,就相當把9的二進位制中最後一位1給去掉了。

利用上述方法,來計算此題的話,給定數字的二進位制中有幾位1便只需迴圈幾次。而第一種方法每次都要迴圈32次。

**如下:

int nubmerof1(int n)

}

以上

完整**及測試用例在github上:點我前往

面試題10 二進位制中1的個數

方法一 判斷整數二進位制表示中最右邊一位是否為1,接著把整數右移一位判斷倒數第二位是否為1,以此類推,直到整數變成0為止。include stdafx.h include using namespace std int countof1 int n n n 1 return ncount int t...

面試題10 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。解法一 可能引起死迴圈 public int numberof1 int n return count 思路 如果乙個整數與1做與運算的結果是1,表示該整數...

面試題10 二進位制中1的個數

面試題10 特殊的情況是右移運算,m n。如果數字是乙個無符號數值,用0填補最左邊的n位。如果是有符號數值,用數字的符號位填補最左邊的n位。左移m 題目 實現乙個函式,輸入乙個整數,輸出該數中二進位制表示中1的個數。整數右移移位和除以2是等價的,但除法的效率比移位運算低得多。常規解法是 將n與1做與...