前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >计算二进制中1的个数

计算二进制中1的个数

作者头像
对编程一片赤诚的小吴
发布于 2024-01-23 06:48:47
发布于 2024-01-23 06:48:47
16600
代码可运行
举报
运行总次数:0
代码可运行

在计算机里,一个int整型的数据的二进制最多有32位,想要统计里面的1的个数,最基本的思路就是让n对2求余(基于10进制转换为二进制的方法)等于1,并实现累加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//方法1,对二求余等于1
int NumOf1(int n){
	int count=0;
	while(n)
	{
		if(n%2==1)
		{
			count++;
		}
		n=n/2;
	}
	return count;
	
	
}

这种方法非常简单,但当一个数非常大时,进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。有没有可以提高效率的方法呢?

第二种方法:遍历二进制位数

开头提到,对于32位的二进制数,如果直接遍历来计数1的话会更加方便,具体操作如下:

这里会用到&(按位与)和>>(右移操作符)进行实现,从最低位开始,每一位都和1按位与(同1为1,异1为0)并进行判断计数,完成后左移一位,既然有32位,就循环32次,重述上述操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//方法2,遍历32位
int NumOf1(int n){
	int count=0;
	for(int i=0;i<32;i++){
		if(((n>>i)&1)==1)
		count++;
	}
	return count;
	
	
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
二者对比起来,后者效率更高,但唯一的缺点是,不管这个数有多大,它都得遍历32次,这样多余的循环次数其实也会影响效率,可不可以将循环次数减少到最小呢?

第三种方法:让n与n-1按位与

前面提到过,按位与的思想是同1为1,异1为0,那如果我们让n与n-1进行按位与会发生什么呢?

举个例子,我们用一个循环来让n与n-1按位与,n设为15,二进制为1111,n-1=14=1110,这时候按位与,我们发现,1111&1110=1110,得到的值与15相比少了1个1,那可不可以将这个1计数呢,我们接着来,这时n=1110,n-1=1101,1110&1101=1100,欸,又少了一个1,继续,这时n=1100,n-1=1011,按位与=1000,最后再与n-1=0111得到0000,循环结束,我们发现,减少的1的个数刚好是15的二进制1的个数,同时也等于循环的次数,极大的提高了效率。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//方法3,n&n-1
int NumOf1(int n){
	int count=0;
	while(n)
	{
		n=n&(n-1);
		count++;
	}
	return count;
	
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JZ15 二进制中1的个数(两种解法)(C语言)
个人博客主页:https://blog.csdn.net/2301_79293429?type=blog 专栏:https://blog.csdn.net/230
用户11039529
2024/03/25
840
【C语言指南】计算整数的二进制位中1的个数 (三种方式)
本文介绍求整数二进制位的1的个数的三种方式,三种方式在运算效率上差异不大,根据自己使用习惯和实际情况灵活运用即可
倔强的石头_
2024/12/06
3670
【C语言指南】计算整数的二进制位中1的个数 (三种方式)
剑指 offer|15. 二进制中1的个数
这道题,可能比较容易想到的就是使用 “与”运算符&的特点( 只有1 & 1的时候等于1)。逐步对二进制的最后一位进行&1的操作,结果为1,则表示含有1,统计数加1 。每次&1操作之后,该数字右移1位。直到这个数为0后停止。
孟君
2022/11/21
2830
剑指 offer|15. 二进制中1的个数
整数的二进制表示中有多少个1的问题
我在剑指offer上面看到这道题,看到这道题是用c++写的,但是我用java编写的时候遇到问题。
actionzhang
2022/11/30
3150
计算机为什么要用二进制?
熟悉编程的人都知道二进制总是一个让人晦涩难懂的词汇,只有大神级的程序员才有资格把玩它。 我们今天来重新认识一下二进制,了解编程中的数学知识和计算机为什么使用二进制?
用户5927304
2019/07/30
3.5K0
计算机为什么要用二进制?
求二进制数中一的个数的三种方法
题目描述:编写一个函数,输入是一个无符号整数,返回的是它所有 位1 的个数(也被称为汉明重量)。
lexingsen
2022/02/24
3420
C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
循环进行以下操作,直到n被缩减为0: 1. 用该数据模2,检测其是否能够被2整除 2. 可以:则该数据对应二进制比特位的最低位一定是0,否则是1,如果是1给计数加1 3. 如果n不等于0时,继续1
走在努力路上的自己
2024/01/26
1770
C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
二进制中1的个数_11
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 输入10 返回2 //思路:
名字是乱打的
2021/12/23
2440
剑指offer:Python 二进制中1的个数 &0xffffffff是什么意思?
Python没有unsigned int类型,负数& 0xFFFFFFFF 返回的数就成一个正数 Python要使用 n & 0xffffffff 得到一个数的补码
全栈程序员站长
2022/08/27
9680
剑指offer:Python 二进制中1的个数 &0xffffffff是什么意思?
【C语言】位操作符与移位操作符练习
前篇我们学习过C语言的位与移位操作符详解【C语言】位与移位操作符详解-CSDN博客
大耳朵土土垚
2024/03/13
1460
【C语言】位操作符与移位操作符练习
剑指Offer(十一)--二进制中1的个数
首先说一个错误的解法,很多人可能会想到,那就是不断对2取余数。但是这种做法有个致命的缺陷,那就是忽略了负数,负数使用补码表示的时候,是取反之后加一,而且
秦怀杂货店
2022/02/15
2160
剑指Offer(十一)--二进制中1的个数
近期作业总结(函数,递归,二进制)
方法一:思路:我们将该数据%2,如果除尽,则证明最后一位数字为0,如果未除尽,则最后一位为1。如果是1,则count++。
用户11039545
2024/03/28
1500
近期作业总结(函数,递归,二进制)
C#版 - Leetcode 762. 二进制表示中质数个1置位 - 题解
762.Prime Number of Set Bits in Binary Representation
Enjoy233
2019/03/05
6770
C#版 - 剑指offer 面试题10:二进制中1的个数 题解
剑指offer 面试题10:二进制中1的个数 二进制中1的个数 提交网址: http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb
Enjoy233
2019/03/05
8630
【优选算法篇】位运算小课堂:从入门到精通的奇妙之旅(上篇)
位运算(Bitwise Operation)是计算机底层操作的核心。它的重要性体现在以下几个方面:
熬夜学编程的小王
2024/12/24
1170
【优选算法篇】位运算小课堂:从入门到精通的奇妙之旅(上篇)
78 - 统计二进制中1的个数
将一个整数转换为二进制形式,统计二进制数中1的个数,如果是负数,按补码统计1的个数 def oneNumber(n): print(bin(n)) if n < 0: # 在python中,负数与0xFFFFFFFF按位与,实际上按照语法,负数在做与操作之前会先把自己转为计算机中的二进制表示形式,然后与0xFFFFFFFF做与操作,也就变成了一个二进制表示的无符号数 n = n & 0xffffffff print(bin(n)) print(
ruochen
2021/06/14
3550
78 - 统计二进制中1的个数
母牛的故事 替换空格 二进制中1的个数 不使用第三个变量交换a,b的值
记录一下牛牛自己在牛客网上刷到的一些题目.分享一下牛牛的解题思路,希望可以帮到大家.
初阶牛
2023/10/14
2510
母牛的故事 替换空格 二进制中1的个数 不使用第三个变量交换a,b的值
疯子的算法总结(一) 位运算(快速幂、快速乘)
计算机通过二进制表示整形数,比如int型32位有符号整形数: 1表示为:0000…00001(共32位) -1表示为:1111…1111(共32位) 补码计算法定义:非负数的补码是其原码本身; 负数的补码是其绝对值的原码最高位符号位不变,其它位取反,再加1。 表示原因:计算机逻辑运算没有减法,-1+1最高为溢出,剩余0000000000(32位)即为0; 则有a-b=a+b的(补码); 计算方式: -1表示原码为100…0001(32位),最高位位符号位。 -1的反码表示为:1111…110(32位),除符号位按位取反。 -1的补码表示为:1111…1111(32位),反码+1。 正数的补码为自己本身。 例子: 100的补码‭00000000000000000001100100‬ -30的补码 11111111111111111111111100010‬ 100+(-30)=000000000000000000‭01000110‬ 转换成10进制为70;
风骨散人Chiam
2020/10/28
8900
输出该数二进制表示中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 代码 public class Solution { public int NumberOf1(int n) { int count=0; while (n!=0){ count++; n=n&(n-1); } return count; } } 这个方法来自牛客,我觉得很厉害就直接借鉴了 分析一下代码:
名字是乱打的
2022/05/13
5950
(一道奇奇怪怪的题)求二进制中1的个数
 链接:二进制中1的个数__牛客网 来源:牛客网输入一个整数 n ,输出该数32位二进制表示中1的个数。(其中负数用补码表示)
比特大冒险
2023/04/16
2170
推荐阅读
相关推荐
JZ15 二进制中1的个数(两种解法)(C语言)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验