劍指offer11
阿新 • • 發佈:2018-01-14
ringbuf void bin pen i++ 開始 n) static 與運算 package jianzhiOffer;
/**
* 輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。
* @author user
*
*/
public class ch11 {
/*
* 使用Java提供的toBinaryString()來實現
* public static String toBinaryString(int i)以二進制(基數 2)無符號整數
* 形式返回一個整數參數的字符串表示形式。
*/
public static int NumberOf1(int n) {
String str = Integer.toBinaryString(n);
System.out.println(str);
int count = 0;
for (int i = 0; i < str.length(); i++) {
if(str.charAt(i) == '1') {
count++;
}
}
return count;
}
/*
* 使用位運算來進行
*
* 如果一個整數不為0,那麽這個整數至少有一位是1。如果我們把這個整數減1,那麽原
* 來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1(如果最右邊的1後
* 面還有0的話)。其余所有位將不會受到影響。舉個例子:一個二進制數1100,從右邊
* 數起第三位是處於最右邊的一個1。減去1後,第三位變成0,它後面的兩位0變成了1,
* 而前面的1保持不變,因此得到的結果是1011.我們發現減1的結果是把最右邊的一個1
* 開始的所有位都取反了。這個時候如果我們再把原來的整數和減去1之後的結果做與運
* 算,從原來整數最右邊一個1那一位開始所有位都會變成0。如1100&1011=1000.也就是
* 說,把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0.那麽一個
* 整數的二進制有多少個1,就可以進行多少次這樣的操作。
*/
public static int NumberOf2(int n) {
int count = 0;
while(n != 0) {
count++;
n = n & (n - 1);
}
return count;
}
public static void main(String[] args) {
System.out.println(NumberOf2(12));
}
}
/* * 手動將十進制轉換為二進制 */ public static String NumberOf3(int n) { int yushu = 0; int result = n; StringBuffer sb = new StringBuffer(); while(true) { yushu = result % 2; result = result / 2; sb.append(yushu); if(result == 0) { break; } } String str = sb.toString(); StringBuffer sb2 = new StringBuffer(); for (int i = str.length() - 1; i >= 0; i--) { sb2.append(str.charAt(i)); } return sb2.toString(); }
劍指offer11