求一個正整數的二進位制表示包含多少1
阿新 • • 發佈:2018-12-15
Java中,int型別佔四位元組,即32位,這裡我們假設正整數n是int型,那麼正整數32的二進位制表示為:
0000 0000 0000 0000 0000 0000 0010 0000
法一:位移法
我們對每一位進行判斷,首先判斷最低位,如果是1,那1的總個數加1,然後右移一位後,再判斷最低位,位移32次,進行迴圈判斷。 這種操作思路很簡單,但存在一定的問題:不管n的二進位制表示中含有多少個1,都需要位移32次,每次判斷最低位是否為1,比較耗時。
法二:求與法
這種方法藉助n&(n-1)這個操作,它可以消除n的二進位制表示中的最後一個1,消除多少次,就有多少個1
法三:查表法
這種方法的思路是以空間換時間,即我先把每一個正整數對應的二進位制1的個數用陣列儲存下來,如下: res[1] = 1; res[2] = 1; res[3] = 2; res[4] = 1; … … … res[32767] = 14; … … 如果要計算n的二進位制表示中1的個數,直接返回res[n]即可。時間複雜度為O(1) 但這種方法有個問題:改表示結果的陣列佔用較大的記憶體空間,在記憶體空間有限制的情況,這種方法不可行。 接下來我們思考一下怎麼減少記憶體空間的使用。演算法的設計,本身是一個時間複雜度和空間複雜度的折衷,增加計算次數,往往能夠減少儲存空間。 思路:把正整數n分解為低16位正整數n1,高16位正整數n2 n1查一次表,其二進位制表示包含x個1 n2查一次表,其二進位制表示包含y個1 則n的二進位制表示包含x+y個1