1. 程式人生 > >劍指offer11

劍指offer11

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