首页 > 其他分享 >求一个无符号整数二进制形式中1的个数(三种方法)

求一个无符号整数二进制形式中1的个数(三种方法)

时间:2024-10-21 23:17:33浏览次数:8  
标签:count return 二进制 个数 unsigned 整数 int num

题目:

输入一个整数,输出这个整数二进制形式中1的个数。

例如:

输入:115

输出:5

解题思路:

方法一:

关键代码:i = i & (i-1),统计i二进制中有多少个1 

具体是如何实现的,实际推几步就可以看出规律。例如2017的二进制形式为11111100001

第一步,11111100001 & 11111100000 = 11111100000    count = 1

第二步,11111100000 & 11111011111 = 11111000000     count = 2

......

每一步结果都会减少一个二进制中的1,并且计数加一,实际上是在统计二进制中1的个数。

方法二:

要求一个数的二进制形式中1的个数,那么首先想到的是求其二进制。常用的方法为除二取余法,当得到的余数为1时,计数加一,从而实现题目要求。

方法三:

根据题目的要求,我想到了逐位去判断是否为1,若是的话则计数加一。那么就需要用到位运算的知识,我们知道1按位与上一个数不改变这个位,0按位与上一个数将这个位零。那么我只需将1不停左移并按位与上要判断的数每一位,就可以得到这个数二进制形式中1的个数。

程序代码:

方法一:

#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{ 
    unsigned int num = 0;
    printf("请输入一个整形数据:");
    scanf("%u",&num);
    printf("该数据二进制中1的个数为:%d\n",return_1(num));
    return 0;
} 
int return_1(unsigned int num)
{
    int count = 0;
    while(num){
    num = (num)&(num-1);
    count++;}
    return count;
}

方法二: 

#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{ 
    unsigned int num = 0;
    printf("请输入一个整形数据:");
    scanf("%u",&num);
    printf("该数据二进制中1的个数为:%d\n",return_1(num));
    return 0;
} 
int return_1(unsigned int num)
{
    int count = 0;
    while(num){
    if(num % 2 == 1){
    count++;
    }
    num = num / 2;
    }
    return count;
}

方法三: 

#include <stdio.h>
int return_1(unsigned int );
int main(int argc, char *argv[])
{ 
    unsigned int num = 0;
    printf("请输入一个整形数据:");
    scanf("%u",&num);
    printf("该数据二进制中1的个数为:%d\n",return_1(num));
    return 0;
} 
int return_1(unsigned int num)
{
    int count = 0;
    int i = 0;
    while(i++ < 32)
    if(((1 << i) & num) != 0)
        count++;
    return count;
}

运行结果:

请输入一个整形数据:643698459
该数据二进制中1的个数为:16

标签:count,return,二进制,个数,unsigned,整数,int,num
From: https://blog.csdn.net/a921876874/article/details/143099814

相关文章

  • PAT (Basic Level)--1002写出这个数
    读入一个正整数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。输入样......
  • LeetCode题练习与总结:区间和的个数--327
    一、题目描述给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower,upper] (包含 lower 和 upper)之内的 区间和的个数 。区间和 S(i,j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。示例1:输入......
  • 代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的
    1.leetcode242.有效的字母异位词题目链接:242.有效的字母异位词-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对......
  • 2024-10-19:用go语言,给定一个正整数 k 和初始数组 nums = [1], 可以执行两种操作:将数组
    2024-10-19:用go语言,给定一个正整数k和初始数组nums=[1],可以执行两种操作:将数组中任一元素加一,或复制数组中任意元素并将其附加到数组末尾。求使得数组元素之和大于或等于k所需的最少操作次数。输入:k=11。输出:5。解释:可以对数组nums=[1]执行以下操作:将元......
  • 关于jpeg图像文件的二进制结构
    https://blog.csdn.net/sinat_26472165/article/details/85342766JEPG的SOF0图像基本信息-帧结构FFC0-SOF0-图像基本信息同样的,0011指示了SOF0块长度为17个字节。前8个字节分别为:字节数 示例中的值 示例中的含义2 0011 SOF0块长度为17个字节1 08 每个像素的每个颜色分量为......
  • base64编码图片二进制数据后直接保存在html文件中
    相关内容:在markdown编辑器中嵌入base64图片看到一个帖子,那就是base64编码用来http服务中对二进制文件编码,那么可以不可以直接在html文件中使用base64编码后的字符串来表示图片呢,于是就有了本文的尝试。注意,这里使用的是markdown格式的图片插入链接格式,即\(![图片文字描述](图......
  • 整数去重-题解
    整数去重-题解题目描述给定含有n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。输入格式输入包含两行:第一行包含一个正整数n(1<=n<=20000),表示第二行序列中数字的个数;第二行包含n个整数,整数......
  • 【MySQL】设置二进制日志文件自动过期,从根源上解决占满磁盘的问题:通过修改 binlog_exp
    引言MySQL的二进制日志(binlog)文件记录了数据库中所有更改的详细信息,包括但不限于对数据的插入、删除、更新,对表和数据库的创建、更改、删除等操作。每一次这样的操作都会在二进制日志中生成一个新的日志事件,并被写入到一个新的二进制日志文件中。因此,如果数据库的活动量较......
  • 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一
    这里写目录标题问题详情分析问题代码展示问题详情剑指Offer56:一个整型数组nums里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例:输入:nums=[4,1,4,6]输出:[1,6]或[6,1]分析问题......
  • 顺序表实现 表LA和表LB的并集、交集、大整数相加
    #include<iostream>usingnamespacestd;#include<math.h>#defineMAXSIZE100#defineERROR0#defineOK1typedefstruct{//定义顺序表  int*elem;  intlength;}SqList;typedefintStatus; voidInitList(SqList&L)//创建顺序表{  L.elem......