二进制中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;
}
发布了70 篇原创文章 · 获赞 58 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41575507/article/details/104964219