1. 程式人生 > >面試題10:輸出二進位制中1的個數

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

1.解法一:

public static int findNumberOf1(int num){
        int count=0;
        while(num!=0){
            if((num&1)!=0){
                count++;
            }
            num=num>>1;
        }
        return count;
    }

注意到上面的解法,有一個缺陷:當輸入的num是一個負數時,會陷入死迴圈:負數的二進位制表示中,最高位是1,當負數做右移操作時,最高位始終設定為1,所以會陷入死迴圈。
2.解法二

public static int findNumberOf1(int num){
        int count=0;
        int flag=1;
        while(flag!=0){
            if((num&flag)!=0){
                count++;
            }
            flag=flag<<1;
        }
        return count;
    }

為了避免死迴圈,在解法二中首先讓num與1做與運算,判斷最低位是否是1,然後讓num與2做與運算,判斷次低位是否是1,如此依次判斷到最高位,相當於flag的逐位左移,來代替num的逐位右移。
但是解法二中要迴圈的次數=二進位制中的位數,也就是說,對於32位的整數,要迴圈32次。

3.解法三:

public static int findNumberOf1(int num){
        int count=0;
        while(num!=0){
            count++;
            num=num&(num-1);//減去一個1
        }
        return count;
    }

在解法三中,迴圈的次數等於整數中1的個數,因為把一個整數減去1,再和原整數做與運算,會把該整數最右邊的一個1變成0.