題目描述:輸入一個函數,輸出該數二進制表示中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;
}