求解一个二进制数中1的个数的三种解法

计算一个数二进制中1的个数超全解法(C语言) 文章目录前言求二进制中1的个数1、第一种思路:n & 11.对1左移左移代码2.把n右移右移代码右移缺陷2种改进代码2、第二种思路:n % 2代码3、第三种思路:n & (n-1) (最容易想不到的)代码 前言 求二进制中1的个数 1、第一种思路:n & 1 对于任何一个数n和1按位与都会得到n的个位是不是1,其他位都会和0相与得0。 个位是0,表达式n&1的结果是0,个位是1,结果也是1. 那么问题就来了这只能判断个位呀,要是判断其他位怎么整呀?? 不慌这里我们 阅读详情

       我们可以将题目理解为求解一个二进制数中每一位上的数相加,如果是0则相加后对于求和不影响,如果为1则每一位上的1相加后得到的恰好是二进制数中1的个数,这是由于二进制每一位上的最大数字恰好是1所产生的特点(即count++ = count + 1)。

        根据以上理解,我们可以得到三种不同的解法。

一、除模法

        如果想要得到一个十进制数中每一位上的数,我们可以将这个数不断的(%10)再(/10)直到这个数变为0为止。

        例如:12345

12345%10=5,12345/10=1234;————5

1234%10=4,1234/10=123;————4

123%10=3;123/10=12;————3

12%10=2,12/10=1;————2

1%10=1,1/10=0;————1

        因此我们可以得到12345每一位上的数分别为:1、2、3、4、5;类比于十进制的方法,我们同理可以得到求解二进制数上每一位数的方法——即:将一个二进制数不断的(%2)再(/2).

        例如:15——1111(二进制)

1111%2=1,1111/2=111;——1

111%2=1,111/2=11;——1

11%2=1,11/2=1;——1

1%2=1,1/2=0;——1

        我们将每一位上的数相加得到4,即15转换成二进制数共有4个1;

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main() {
    int input = 0;
    scanf("%d", &input);
    int count = 0;
    while (input != 0)
    {
        if ((input % 2) == 1)
            count++;
        input /= 2;
    }
    printf("%d", count);
    return 0;
}

但是我们又会发现,如果输入的是负数,例如:-1,就会得到以下结果:

这是因为按照上述代码逻辑,input=-1,-1%2=-1,之后input/2=0直接跳出循环,所以count=0。

由于计算机存储数据采用的是补码,例如:-1

源码:10000000000000000000000000000001 

反码:11111111111111111111111111111110

补码:11111111111111111111111111111111

所以按理来说,-1的二进制数应该有32个1,但此时却显示0。

那这个方法是不是就失效了呢?

当然不是,只需要稍微修改一下代码也可以完成题目要求

此时我们只需要把input的数据类型改为unsigned int,将-1视为是一个很大的正数(因为其二进制补码在无符号情况下很大)进行运算即可。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main() {
    unsigned int input = 0;
    scanf("%u", &input);
    int count = 0;
    while (input != 0)
    {
        if ((input % 2) == 1)
            count++;
        input /= 2;
    }
    printf("%d", count);
    return 0;
}

二、位运算——右移法

       计算机存储数据采用的是补码形式,通过将二进制数与1进行按位与“&”可以得到二进制数个位数为0还是1,之后再进行右移操作即可将原来的个位数删去,将第二位数变成个位数再次进行按位与操作,以此类推即可得到二进制数中1的个数。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main() {
    int input = 0;
    scanf("%d", &input);
    int count = 0;
    for (int i = 0; i < 32; i++)
    {
        if (((input>>i) & 1) == 1)
            count++;
    }
    printf("%d", count);
    return 0;
}

 三、位运算——按位与法

在讲解这个方法之前我们先来看一组运算。

假设:n=15;

          n&(n-1)=(1111)&(1110)=1110,令n = 1110

          n&(n-1)=(1110)&(1101)=1100,令n = 1100

          n&(n-1)=(1100)&(1011)=1000,令n = 1000

          n&(n-1)=(1000)&(0111)=0000,令n = 0

我们不难发现在执行n&(n-1)操作时,n的最后一个1逐次变成0,直到n=0

因此,利用这种运算方法我们也可以求解出二进制数中1的个数。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main() {
    int input = 0;
    scanf("%d", &input);
    int count = 0;
    while (input != 0)
    {
        input = input & (input - 1);
        count++;
    }
    printf("%d", count);
    return 0;
}

无论是正数还是负数,以上三种方法均可以实现。其中第三种方法不是一下就能想到的,它要求对于位运算掌握度比较深。

其中第三种方法n&(n-1)还可以用来求解一个数是否是2的n次方。

因为该运算本质上是将二进制数最后一个1置0,如果这个数是2的n次方,则n&(n-1)==0

求一个数的二进制表示中1的个数和0的个数 在我复习的过程中,很多面试题,甚至笔试题中,都用到了多次求一个整数的二进制表达中1的个数或者0的个数,网上的资料比较乱,我在此做个小记录,算是自己的一点总结,也希望对大家有帮助! 1.1 求二进制数中 1 的个数(java版——算法转换) public int getNumOfOne_1(int num){ int count = 0; while(num != 0){ num = ... 阅读详情

相关推荐

LeetCode.485 最大连续1的个数(python解法)

目录题目solution_1solution_2参考资料 题目 给定一个二进制数组, 计算其中最大连续1的个数。 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正整数,且不超过 10,000。 solution_1 思路:用一个变量记录当前连续1的个数,...

weixin_41638083的博客 732

计算一个数的二进制中一的个数(三种方法)

计算一个数的二进制中一的个数(三种方法)

m0_57248981的博客 7624

【Vite+Vue3+TS】基于Vite+Vue3+TypeScript+ESLint+Prettier+Stylelint搭建项目(亲测超详细)

结合了很多项目和文章,总结一篇项目构建的笔记。 温馨提示:文章末尾记录了我在搭建项目过程中,遇到的一些问题和解决办法 ~

aDiaoYa_的博客 4224

求二进制中1的个数。(三种方法)

求二进制中1的个数。(三种方法) 第三种最高效!!!

wihkum 1万+

LVGL项目内存告急?试试把中文字库放到SD卡里(基于LvglFontTool V0.5)

本文详细介绍了在LVGL嵌入式项目中如何通过将中文字库存储到SD卡来优化内存使用。针对Flash资源有限的MCU,如STM32F103,提供了基于LvglFontTool V0.5的外部字库生成与动态加载方案,适用于多字号、多语言及OTA场景,显著减少固件体积并提升显示灵活性。

weixin_33726318的博客 450

基于RTL8367S与XS2184的工业级POE交换机硬件设计全解析

本文深入解析基于RTL8367S与XS2184芯片的工业级POE交换机硬件设计,涵盖核心价值、芯片选型、原理图设计、PCB布局及可靠性验证等关键环节。重点探讨双芯片协同工作优势,如RTL8367S的自适应调度算法和XS2184的智能功率分配功能,为工业环境下的稳定供电与数据传输提供专业解决方案。

weixin_42614269的博客 451

计算一个数的二进制中1的个数(三种方法保姆级详解~)

写一个函数返回参数二进制中 1 的个数。

jiminkoo的博客 1万+

4、机器人建模、规划与控制及运动学知识解析

本博客深入解析了机器人建模、规划与控制的核心内容,涵盖运动学与动力学的基本原理,并结合典型应用场景探讨了移动机器人与操作器的控制策略。同时,博客还介绍了机器人技术的发展趋势及其在工业和服务领域的广泛应用。

desk3的博客 118

冰冰学习笔记:二进制中1的个数的三种统计方法

操作符的深入理解和应用 三种方法求解而二进制中1的个数

bingbing_bang的博客 2555

uniapp [微信小程序] - 实现语音播报功能+实时收款播报,使用同声传译插件做文字转语音播报类似微信/支付宝收款播报小程序语音识别和朗读,手机提醒播放自定义收款语音信息(音频+收款金额+文案)

uniapp-实现语音播报功能,实时收款播报,uni-app/vue 文字转语音朗读(附小程序语音识别和朗读)uniapp小程序使用文字转语音播报类似支付宝收款播报小程序语音识别和朗读)IOS苹果手机播报没有声音,生成语音并播放,微信小程序接入官方wechatSi(微信同声传译)uniapp小程序使用文字转语音播报类似支付宝收款播报,uni-app 小程序端实现文字语音播报,uniAPP文本转语音,uniapp 文字转语音文字播报,手机静音播放没声音,收款方提示音 文字转语音朗读 同声传译,uniapp小程

🏆 前端领域优质创作者 3792

基于Transformer的股票市场多因子量化选股模型,深度解析:基于Transformer的股票市场多因子量化选股模型

传统多因子模型通常采用线性回归、岭回归或Lasso回归来估计因子权重,其核心假设是因子与未来收益之间存在线性关系。然而,现实中的股票市场具有典型的非线性、非平稳和高噪声特征。卷积神经网络(CNN)擅长提取局部特征,但难以捕捉全市场股票之间的全局依赖关系;循环神经网络(RNN)及其变体LSTM虽然能处理时间序列,但存在梯度消失问题且难以并行计算。Transformer的self-attention机制能够:直接建模任意两只股票之间的相关性动态计算因子权重而非静态线性组合。

YOLO 243

计算出二进制数中有多少个1

计算出二进制数中有多少个1 《编程之美》这本书被很多计算机专业的学生奉为面试经典, 其中也包括我。早就听高年级学长说过,面试中的题目有80%取自《编程之美》这本书, 掌握了其中的全部算法可以为自己的面试带来很多的好处。从今天起, 我每天更新编程之美上的一个算法, 方便想要学习的童鞋学习。 计算机专业的学生对二进制数应该都不陌生, 二进制就是由连续的有穷的0,1序列组

@奮 鬥@的专栏 3173

黑猫带你学Nand第8篇:NandFlash的供电情况详解

是指在任何工作条件下,设备允许的最大电压、电流、功率以及温度等参数的界限值。

黑猫奥利奥的博客 1142

【剑指offer】二进制中1的个数&&2的幂

每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根。

joy.728的博客 709

uniapp:详细ios本地离线打包完整流程,使用XCode苹果本地离线打包APP,UNIAPP IOS离线打包并上传到上传到App Store应用商店(mac环境 Uniapp iOS本地离线打包)

uniapp ios 本地离线打包(攻略),iOS App打包发布上架,uni-app项目离线打包之iOS,uni-app实现XCode苹果本地离线打包APP,UNIAPP之IOS离线打包,iOS开发打包ipa,uniapp 打包 IOS,uniapp ios app离线打包配置,uniapp打包离线App(ios),uniapp ios打包详细步骤,最新版iOS Xcode如何证书配置和ipa打包(附图文教程)uniapp申请ios证书,uniapp iOS打包,证书申请,XCode打包IOS应用发布Ap

✅ 精选推荐文章 4505

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

2.1求二进制数中1的个数

2.1求二进制数中1的个数 题目: 对于一个字节(8bit)的无符号整型变量,求其中二进制表示中“1”的个数,要求算法的执行效率尽可能高。 解法一 对于二进制操作,除以一个2,原来的数字将会减少一个0。如果除的过程中有余,那么就表示当前位置有一个1。以10100010为例: 第一次除以2时,商为1010001,余为0。第二次除以2时,商为101000,余为1。 时间复杂度为O(

whiterbear的专栏 1505

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

求解二进制数中1的个数

这道题很多考试中都出现了,去年参加阿里笔试就考到了这道题,编程之美也提到了,比较好的方法采用位操作,解决方法如下: 执行一次x&(x - 1),将最右边的1置为0,知道最后x变为0,循环结束,时间复杂度是O(M),其中M是二进制数中1的个数。 另一种解法,时间复杂度是log(n),其中n是二进制数总的位数 #include int main() { unsigne

lxmky的专栏 887

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

位运算-二进制中1的个数(三种解法)

题目一:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。如9的二进制表示为1001,有2位是1.   实例代码: import java.util.Scanner; public class 二进制中1的个数 { public static void main(String[] args) { Scanner scanner = new Scanner(Sy...

weixin_30951231的博客 487

统计一个整数的二进制中1的个数的三种解法

一、每一位与0x1进行与运算 int countOne(int num)   {       int count = 0;       while ( num )       {           if( num & 1 ){               ++count;           }           num >>= 1;       }     

互联网IT 1万+

数字之魅-----数字中的技巧之求二进制数中1的个数

2012年1月30日 数字之魅-----数字中的技巧之求不要被阶乘吓倒 阶乘(Factorial)是个很有意思的函数,但是不少人都比较怕它,我们来看看两个与阶乘相关的问题:        1.   给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。        2.   求N!的二进制表示中最低位1的位

Linlei的专栏 1575

Pop Count Problem (二进制数中1的个数)

原文链接:http://blog.ibread.net/375/pop-count-problem/ 以下文章中有大红色背景的文字是我转载时做的注释。 一、问题描述:求一个N位整数x的二进制表示中1的个数,越快越好。 据说这是道很著名的面试题。原题是

zentropy的专栏 2166

求二进制数中1的个数

对于一个字节(8bit)的变量,求其二进制表示中”1”的个数,要求算法的执行效率尽可能的高。 这道题看似简单,但对于这道题作者却给了出五中解法。 解法一:每次求余,看余数是否为1,如果是的话就累计加一,然后再除以2,重复以上步骤,直到为0,最后这个结果就是二进制表示中1的个数。//求余统计二进制数中1的个数 int Count(unsigned char v) { int num=0;

xuguoli_beyondboy的专栏 1694

【leetcode】前n个二进制数中1的个数

动态规划

weixin_44627672的博客 623

面试题:求二进制数中的”1“的个数

题目:实现一个函数,求一个输入值的二进制表示中1的个数。 1、错误的解法:!!!!!! 将这个数右移位,直到这个数变为0. int calculate_one(int num){ int count=0; while (num){ if (num & 1) count++; count=count>>1; } return count; } 上面这种解法只适用于正数,不适应负数。负数最高位为符号位1,右移之后仍为1,会产生错误。正确解法如下: 方法2:正确解法 i

l494924841的博客 248

剑指offer---二进制中1的个数

剑指offer—二进制中1的个数 问题分析 本题是为了求解一个整数的二进制中1的个数。比如9(1001),它的二进制数就有两个1。 这类的题目大部分都会用到位运算的知识,位运算非常抽象,而且在日常的生活中很少碰到,但是位运算的核心很简单,因为位运算的种类就那么几个(或、与、非、异或、左移和右移),所以只要将这些基本的操作熟记于心,这类的题目就好做了。 回到上面这题。第一种解法就是不断的将这个数进行...

leetcode 第105题(从前序与中序遍历序列构造二叉树) ,第106题(从中序与后序遍历序列构造二叉树) 353

求二进制中1的个数的几种解法

题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 牛客网题目链接 求解思路1 我们可以设置一个无符号整数1,从低位往高位(1-32)一直移动,然后与整数对应位置的数字进行比较(与运算),来实现计算1的个数,代码如下: class Solution { public: int NumberOf1(int n) { int count=0; unsigned int flag=1; while(flag){

Jeaten 383
上一篇: 使用修饰符“#”控制前导显示
下一篇: 由于数组越界访问导致的死循环
NASA_0728
博客等级 码龄2年 10粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值