输入一个整数n,输出该数32位二进制表示中1的个数,其中负数用补码表示
写一个函数返回参数中二进制中1的个数
法一:类似于之前写的求十进制的一个数的每一位https://blog.csdn.net/qq_45917670/article/details/142497010?spm=1001.2014.3001.5502
如n=5(二进制0101)
n%2=1,count+1=1,n=5/2=2,
n%2=0,count不变,2/2=1,
1%2=1;count+1=2,1/2=0,循环停止
int count_num_of_1(unsigned int n){
int count=0;
while(n){
if((n%2)==1){
count++;
}
n/=2; }
return count;
}
法二:将32为二进制位依次与1相与(0&1=0,1&1=1),计算相与等于1的共多少位
int count_num_of_1(int n){
int i=0;
int count=0;
for(i=0;i<32;i++){
if(((n>>1)&1)==1){
count++;
}
}
return count;
}
法三:通过n&(n-1 )判断
如
1111 n
1110 n-1
1110 n
1101 n-1
1100 n
1011 n-1
1000 n
0111 n-1
0000 n
n&(n-1)每次都会消去n最左边的1,直至n=0
另外还可用此方法判断一个数是否为2的n次方,n&(n-1)==0即为2的n次方
如n=4(二进制0100)n-1=0011,(0100)&0011=0
int count_num_of_1(int n) {
int count=0;
while(n) {
n=n&(n-1);
count++;
}
return count;
}
主函数:
int main() {
int num=0;
scanf("%d",&num);
int n=count_num_of_1(num);
printf("%d\n",n);
return 0;
}
运行结果:
10的二进制:1010