/*
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
备注:方法1和方法2类似,只是法2固定循环了32次
时间:2021/10/18
*/
#include<cstdio>
#include<iostream>
using namespace std;
// 方法1:从右最低位至最高位判断每一位是不是1
int re1(int n){
int ans=0;
while(n!=0){
if(n&1==1)ans++;
n=n>>1; //正数高位自动补0
}
return ans;
}
// 方法2:数的每一位(32位)和1与是否等于1
int re2(int n){
int i=1,ans=0;
while(i<=32){
if((n>>i)&1==1)ans++;
i++;
}
return ans;
}
// 方法3:'减1'再'与'能消除二进制整数最低位右边的1
int re3(int n){
int ans=0;
while(n!=0){
ans++;
n=(n-1)&n;
}
return ans;
}
int main(){
printf("方法1:%d\n",re2(9)); // 9(10) = 1001(2)
printf("方法2:%d\n",re2(9));
printf("方法3:%d\n",re3(9));
return 0;
}
方法3草稿:
/*
题目:用一条语句判断一个整数是不是2的整数次方
备注:题意=判断整数的二进制是否只有一个1
时间:2021/10/18
*/
#include<cstdio>
#include<iostream>
int re(int n){
if(n!=0 && ((n-1)&n)==0)return 1; //减1并相与可以消除最低位的1
return 0;
}
int main(){
printf("%d\n",re(4)); // 1
return 0;
}