首先在java中整數(shù)的二進(jìn)制表示是31位最高位32位是符號位募疮,所以我們可以采用一個巧妙的辦法吐句,每次去比對一個整數(shù)的二進(jìn)制位的每一位是否是1 牺勾,我們可以采用與運(yùn)算(&)去比較,與運(yùn)算是二進(jìn)制運(yùn)算只有2個1才為1,其余全為0所以可以通過下面這一段代碼進(jìn)行判斷伐债。
public int NumberOf1(int n) {
? ? ? ? int sum = 0 ;
? ? ? ? int a = 1 ;
? ? ? ? while(a != 0){
? ? ? ? ? ? if((n & a)!= 0 ) sum ++ ;
? ? ? ? ? ? a = a<<1 ;
? ? ? ? }
? ? ? ? return sum ;
? ? }
利用sum來記錄1個個數(shù),當(dāng)a為1時對應(yīng)的二進(jìn)制是1致开,所以比較的是第一位的數(shù)是否為1峰锁,當(dāng)a進(jìn)行右移運(yùn)算,則a變?yōu)?了對應(yīng)的二進(jìn)制是10則双戳,會比較第二位是否為1虹蒋,依次類推,進(jìn)行計算,總體來說這個計算速度是比較快的魄衅,因為計算基本都是位運(yùn)算計算速斷較快峭竣,所以這是一種比較快的統(tǒng)計整數(shù)中1個數(shù)的方法。