1. 程式人生 > >【劍指offer】輸入一個整數,輸出該數二進位制表示中1的個數,其中負數用補碼錶示。

【劍指offer】輸入一個整數,輸出該數二進位制表示中1的個數,其中負數用補碼錶示。

題目要求

輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。

核心思路

  1. 如果一個整數不為0,那麼這個整數至少有一位是1,如果把這個整數減1,那麼原來整數最右邊的1就會變為0,原來在1右邊的所有0都會變為1。那麼,利用n = n & (n - 1),如1100 & 1011 = 1000,也就是說,把整數減1,再和原數進行與運算,就會消去一個1。利用這個特性我們就可以算出1的個數。
  2. 把整數轉換為二進位制字串,把字串轉為char陣列,再進行遍歷計算。

完整程式碼如下

/**
 *輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。 
*/
public class Solution { //核心思想:n = n & (n-1) public int NumberOfOne1(int n) { if(n == 0) return 0; int count = 0; while(n != 0) { n = n & (n-1); count++; } return count; } //核心思想:字串陣列 public int NumberOfOne2(int n) { int count = 0; char[] charArray = Integer.toBinaryString
(n).toCharArray(); for (int i = 0; i < charArray.length; i++) { if (charArray[i] == '1') { count++; } } return count; } public static void main(String[] args) { Solution sl = new Solution(); System.out.println(sl.NumberOfOne1(5)); System.out.println(sl.NumberOfOne2(5));
} }