1. 程式人生 > >10、二進位制中1的個數

10、二進位制中1的個數

題目

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

我的解法

public int NumberOf1(int n) {
		int[] list = new int[32];
		int res = 0;

		int temp = Math.abs(n);
		int index = 31;
		while (temp != 0) {
			list[index] = (temp % 2);
			temp = temp / 2;
			index --;
		}

		if (n < 0) {
			int mark = 1;
			for (int i = 31; i >= 0; i--) {
				int num = 1 - list[i];
				list[i] = (num + mark) % 2;
				mark = (num + mark) / 2;
			}
		}

		for (int num : list) {
			res += num;
		}

		return res;
	}
演算法分析:求出數字的二進位制表示,然後分正負數來計算1的個數。

答案解法

	public int NumberOf1(int n) {
		int res = 0;
		while (n != 0) {
			if ((n & 1) != 0)
				res++;
			n = n >>> 1;
		}
		return res;

	}
演算法分析:一個int數字既是一個十進位制數字、又是一個二進位制位元數字,可以對其直接進行二進位制操作。則通過右移位來統計1個的個數。遍歷n次。

巧妙解法:遍歷k次,k為1個數

利用n & (n - 1)操作,相當於每執行一次,就把n的最右邊1去掉。那麼只需要k次,則n==0.