1. 程式人生 > 實用技巧 >《劍指offer》第十五題:二進位制中1的個數

《劍指offer》第十五題:二進位制中1的個數

題目:請實現一個函式,輸入一個整數,輸出該數二進位制表示中1的個數,例如,把9表示成二進位制是1001,有2位是1。如果輸入9,輸出為2

解法一:

java實現:

int NumberOf1Test01(int n){
int count=0;
while(n>0){
if((n&1)!=0){
count++;
}
n=n>>1;
}
return count;
}
C++實現:
int NumberOf1Test01(int n) {
int count = 0;
while (n) {
if (n & 1) {
count++;
}
n = n >> 1;
}
return count;
}
思路:將該數字與1(只有最右面一位數字為1)進行位運算,比較該數字最右面一位數字是否為1,比較完之後將該數字右移一位,繼續比較右側第二個數字,以此類推。
但是,該解法是錯誤的,錯誤原因:若該數字是負數,右移會在左面第一位補1,最終導致無限迴圈。
解法2:
java實現:
int NumberOf1Test02(int n){
int count=0;
int flag=1;
while(flag!=0){
if((count&flag)!=0){
count++;
}
flag=flag<<1;
}
return count;
}
C++實現:
int NumberOf1Test02(int n) {
int count = 0;
unsigned int flag = 1;
while (flag) {
if (count & flag) {
count++;
}
flag = flag << 1;
}
return count;
}
思路:利用flag和n的各位進行比較,flag為1,和n的右邊第一位進行比較,然後flag右移,在和第二位進行比較,以此類推,等到和n的最後一位比較完後,再右移,為0,比較結束。
解法3:
java實現:
int NumberOf1Test03(int n){
int count=0;
while(n!=0){
n=(n-1)&n;
count++;
}
return count;
}
c++實現:
int NumberOf1Test03(int n) {
int count = 0;
while (n ) {
n = (n - 1) & n;
count++;
}
return count;
}
思路:n-1將把n各位中,第一個出現的1變為0,該位右邊的各位設成1,和n進行&運算,將把該位右邊的1全部化成0(0與1&運算還為0),再賦值給n,將消除一個為1的位,迴圈該過程,將把1全部消除,求得count。
結論:把一個整數減去1再和原來的整數做位運算,結果將為把該整數最右邊的1變成0.