题目描述:输入一个函数,输出该数二进制表示中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;
}