1. 程式人生 > >劍指offer--二進位制中的1的個數--補碼

劍指offer--二進位制中的1的個數--補碼

題目描述

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

首先複習一下補碼。。這道題考的位運算 --> 位運算

計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。
在計算機系統中,數值一律用補碼來表示和儲存。
正數補碼就是原碼;如+9,的原碼和補碼都是一樣:1001; 負數補碼是原碼取反再加1:如-5的補碼: -5對應正數5(00000101)→所有位取反(11111010)→加1(11111011) 所以-5的補碼是11111011。 同一個數字在不同的補碼錶示形式中是不同的。比如-15的補碼,在8位二進位制中是11110001,然而在16位二進位制補碼錶示中,就是1111111111110001。以下都使用8位2進位制來表示。
public class 二進位制中1的個數 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(NumberOf3(10));
	}
	
	/*把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0.
	 * 那麼一個整數的二進位制有多少個1,就可以進行多少次這樣的操作。
	 * 這樣迴圈次數就等於1的個數*/
    public int NumberOf1(int n) {
    	int count =0;
    	while (n!=0) {
			n = n&(n-1);
    		count++;
		}
		return count;
    }
    
    /*挨個做位運算,為1的就加一次*/
    public int NumberOf12(int n) {
    	int count =0;
    	int flag = 1;
    	while (flag!=0) {
			if ((flag&n)==1) {
				count++;
			}
			flag=flag<<1;
		}
		return count;
    }
    
    /*用API。 讓我用API 也想不出來。*/
    public static int NumberOf3(int n) {
    	return Integer.toBinaryString(n).replaceAll("0","").length(); 
    }

    
}