二進制中1的個數(位運算)

題目描述:輸入一個函數,輸出該數二進制表示中1的個數。(例如:9的二進制爲1001,有兩個1,所以輸出2)

解題思路:可以直接使用位運算中的與運算(&)來做這道題目。用1從右到左移動與N做與運算,然後判斷得到的結果是不是和1右移i位之後的得到的結果相同,相同就證明該位上的二進制爲1.那麼就使count+1.比如9的二進制爲1001,1右移三位得到的結果爲1000,1001 & 1000 = 1000。所以就證明該位上的二進制爲1。也可以將N不斷的進行右移然後將得到的結果與1進行比較。比如1001右移3位得到0001,0001&1 = 1。也可以證明該位的二進制爲1。

java代碼 :

import java.util.Scanner;

public class _1的個數 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		// 輸出N的二進制
		System.out.println(Integer.toString(N, 2));

		int count = 0;
		// 將1不斷向左移動
		for (int i = 0; i < 32; i++) {
			// 每次都將N的二進制的第i位與1做與運算,1 << i 表示第i位爲1,其他位爲0的整型值
			if ((N & (1 << i)) == (1 << i)) {
				// System.out.println(Integer.toString((1<<i), 2));
				count++;
			}
		}
		System.out.println(count);

		count = 0;
		// 將N不斷進行右移與1做比對
		for (int i = 0; i < 32; i++) {
			if (((N >> i) & 1) == 1) {
				count++;
			}
		}

		System.out.println(count);
	}

}

C++代碼:

#include<iostream>
using namespace std;

int main(){
	int N,count = 0;
	cin>>N;
	for(int i=0;i<32;i++){
		//注意這裏的括號不能省 (N & (1<<i))否則會出錯。 
		if((N & (1<<i)) == (1<<i)){
			count++; 
		}
	}
	cout<<count<<endl;
	
	count = 0;
	for(int i=0;i<32;i++){
		if(((N>>i)&1) == 1){
			count++;
		}
	} 
	cout<<count;
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章