給定乙個32位的整數n,可為0,可為正,也可為負,返回該整數二進位制表達中1的個數。
最簡單的做法就是求出乙個整數如何得到它的二進位制數。以整數5為例。用5除以2,取餘的結果為1時代表二進位制表達中含有乙個1,此時的被除數變為5/2。迴圈直到被除數為0,迴圈結束。
注意:負數的二進位制表示的首位為1.在計數之前需要判斷n的正負。
/**
* 整數二進位制中有多少個1
*/public int getnumofone(int n)
tar /= 2;
} return num;
}
上述方法雖然可以順利的求出給定整數的二進位制表達中1的個數。但是卻有乙個致命的缺點就是時間複雜度太高。因此有了改進演算法的需求。有一種辦法可以降低迴圈的次數即時間複雜度。該方法的主要思想是每次唯讀二進位制中1的個數。
因此每次迴圈的時候只需要去掉最右端1的個數,直到n為0迴圈結束。
/**
* 整數二進位制中有多少個1
*/public int getnumofone2(int n)
return num;
}
還有一種去除最右端1的方法
/**
* 整數二進位制中有多少個3
*/public int getnumofone3(int n)
return num;
}
在介紹一種平行演算法。該演算法和歸併排序很像。首先算出相鄰兩位1的個數,再算相鄰四位1的個數...直到相鄰32位(int最多表示的就是32位)1的個數。
以294848552為例
二進位制表示為:10001100100110000100000101000
* 整數二進位制中有多少個4
*/public int getnumofone4(int n)
整數的二進位制表示式中有多少個1
給定乙個32位整數n,可為0,可為正,也可為負,返回該整數二進位制表達中1的個數 整數n每次進行無符號右移一位,檢查最右邊的bit是否為1來進行統計,如下 public int count1 int n return res 上面這個方法在最複雜的情況下要經過32次迴圈 public int cou...
微創 求整數的二進位制表示中有多少個1
現有一整數n,求n用二進位制表示中有多少個1?解法一的步驟 1 判定n是否為0,若為0,計算結束 否則繼續計算 2 取n mod 2的值,若為1,計數器加1 3 對n進行除2,並返回到步驟 1 如下 int count1bits int n while 0 n return count 解法二 先來...
兩個整數二進位制表達中,有多少個位 bit 不同
程式設計實現 兩個int 32 位 整數m和 n的二進位制表達中,有多少個位 bit 不同?輸入例子 1999 2299 輸出例子 7 1 利用移位運算,將32位二進位制數儲存在陣列中,然後比較兩個陣列中各個元素是否相同。如下 include includeint main for i 0 i 32...