统计二进制中1的个数(C语言)

简介: 题目概述方法一方法二方法三

题目概述

给定一个整数n,写一个函数输出32位二进制表示中1的个数(负数用补码表示)

方法一

分析:当我们在计算1234的每一位数相加之和时,对于得到每一位数,我们的方法是用1234%10,得到4,再将1234/10,得到123,再用123%10,如此循环,直到1234变为0。

同理,对于得到整数的每一个二进制位,我们可以通过%2,/2的方式,得到该整数的每一个二进制位


代码如下

intNumberOf1(intn)
{
intcount=0;
while (n)
    {
if (n%2==1)
        {
count++;
        }
n/=2;
    }
returncount;
}

测试

#include <stdio.h>intNumberOf1(intn)
{
intcount=0;
while (n)
    {
if (n%2==1)
        {
count++;
        }
n/=2;
    }
returncount;
}
intmain()
{
intn=0;
scanf("%d", &n);
intret=NumberOf1(n);
printf("%d的二进制中1的个数为%d", n, ret);
return0;
}


测试结果



然而,当输入的整数为负数时,结果就会出问题


-1的补码为11111111111111111111111111111111

然而结果却为0,通过调试可以发现,当n为-1时,n%2的结果为-1,不等于1,count值不变,而-1/2的结果为0,此时循环退出。



对于这种情况,我们可以使用unsigned int类型来接收n,将n转换为无符号的整数

intNumberOf1(unsignedintn)
{
intcount=0;
while (n)
    {
if (n%2==1)
        {
count++;
        }
n/=2;
    }
returncount;
}

再次测试

此时结果正确

但是,对于这种方法,接收类型必须为unsigned int

方法二

若用n&1,则可以得到n的最后一位,再右移,移除已比较的位数,得到下一位,循环32次,得到二进制中每一位

代码如下

intNumberOf1(intn)
{
intcount=0;
for (inti=0; i<32; i++)
    {
//将n向右移动i位,再&1if (((n>>i) &1) ==1)
        {
count++;
        }
    }
returncount;
}

测试



但是,对于这种方法,要取出二进制中的每一位,则必须循环32次

方法三

当n&(n-1)时,能够去除n的二进制中最后一位1

例如

n = 10,二进制:1010

n - 1 二进制:1001n&(n-1) = 1000

每一次n&(n-1),就去处二进制中一个1,则当n&(n-1)为0时,就去除了n中所有的1

代码如下

intNumberOf1(intn)
{
intcount=0;
while (n)
    {
n=n& (n-1);
count++;
    }
returncount;
}

测试

目录
相关文章
|
C语言
精准统计C语言中的行数
精准统计C语言中的行数
精准统计C语言中的行数
|
存储 C语言
C语言实现二进制到十进制
C语言实现二进制到十进制
125 0
|
算法 C语言 开发者
C语言精确统计字符串中的神秘字符
C语言精确统计字符串中的神秘字符
67 0
|
6月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
139 13
|
7月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
384 5
|
C语言
【C语言】输入一个数n,输出从n到n+100的范围内所有的素数,并统计素数的个数
【C语言】输入一个数n,输出从n到n+100的范围内所有的素数,并统计素数的个数
520 0
C语言实战项目——学生试卷分数统计
C语言实战项目——学生试卷分数统计
|
C语言
C语言---二进制位置0或者置1
C语言---二进制位置0或者置1
150 1
|
C语言
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
|
C语言
C语言-----计算两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
C语言-----计算两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
97 0