每列大于0的个数_二进制中1的个数(剑指offer第十四天)
二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。
解题思路
看完题目首先想到的也是最直接的方法,那就是把n往右移32次,每次都和1进行与运算,这样循环32次就能得出1的个数了。直接上代码。
class Solution {public:int hammingWeight(uint32_t n) {int count = 0;for (int i = 0; i < 32; i++) {if (((n >> i) & 1) == 1) {count++;}}return count;}
};
解完后自己又想了一种办法,因为二进制数每一位都是2的幂次方,那我们就先找到不大于n的2的最大幂次,然后计数值+1;再用n-2^(i-1) 再次与2^i 比较,直到n-2^(i-1)>=2时退出循环。然后再判断如果他们的差值,如果等于1,说明是奇数,则最后一位为1,返回最终计数值+1;如果他们差值为0,直接返回最后计数值。
class Solution {public://int num=0;int hammingWeight(uint32_t n) {uint32_t tem=n;int num=0;while(tem>=2){int i=0;while(pow(2,i)<=tem){i++;}tem-=pow(2,i-1);num++;}if(tem==1)return (int)num+1;elsereturn (int)num;}
};
可能上面说的不太好理解,下面介绍一种大佬写的方法:巧用n&(n−1)
(n - 1)解析: 二进制数字 n最右边的1变成 0,此1右边的0都变成 1
,n&(n−1) 解析: 二进制数字n最右边的1变成 0,其余不变。
算法流程:
初始化数量统计变量 res 。
循环消去最右边的 1:当 n = 0时跳出。
res += 1 : 统计变量加 1;
n &= n - 1 : 消去数字 n最右边的 1。
返回统计数量 res
class Solution {public:int hammingWeight(uint32_t n) {int res = 0;while(n != 0) {res++;n &= n - 1;}return res;}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了86.21%的用户
作者:jyd链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/solution/mian-shi-ti-15-er-jin-zhi-zhong-1de-ge-shu-wei-yun/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
每列大于0的个数_二进制中1的个数(剑指offer第十四天)相关推荐
- 计算一个数的二进制中1的个数
/**计算一个数的二进制中1的个数*/ #include int numberOf1InBinary(const unsigned int a); int numberOf1InBinary_Mask ...
- 如何判断一个数的二进制中1的个数(num = (num - 1))
//可以用下面的方法 int count_one(int num) {int count = 0; //记录1的个数while (num){++count;num &= (num - 1); ...
- 剑指offer_第11题_二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数. 其中负数用补码表示. 理解 整数怎么转换为二进制 >>> bin(25) '0b11001' >>> bin ...
- python输出二进制数_二进制中1的个数(python)
题目描述:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析:如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1 ...
- 剑指Offer:二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数. // 二进制中1的个数 #include <stdio.h>int wrong_count_1_bits(int n) // 错误解法: ...
- VIPKID:笔试题(数组中和为0的一对数的数量,十进制转二进制中1的个数)
1. 求数组中的和为0 的一对数的数量 注意,需要用到set import java.util.Scanner;public class Main{public static void main(St ...
- 求栈中元素个数算法_精妙的算法——计算二进制中1的个数
如何计算二进制中1的个数? 全部遍历一遍? 不--不--这不是最优解-- 下面看一段代码: int bitcount (unsigned int n) {int count=0 ;while (n) ...
- 《剑指offer》c++版本 15.二进制中1的个数
如题: 平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1, ...
- 整数二进制中1的个数
要统计一个整数二进制中1的个数,首先我们会想到最简单的方法就是 % 2 再 / 2,然后判断每一位是否为1. 但是,如果这是一个很大的数,频繁的除法运算效率不是很高.而位运算比乘除法效率高,所以我们就 ...
最新文章
- 未处理的异常导致基于 ASP.NET 的应用程序意外退出
- python3.6 在 windows10 下使用pycrypto
- 用rvest包来抓取Google学术搜索数据
- linux下mysql中文乱码
- HDU 2376 Average distance
- (三)SpringMVC实现
- QQ密码算法 用于命令行登录
- Android之安装开发环境
- 3-25构造方法String类中的api
- 关于高通平台9008线刷的一些注意点,供小白食用。
- leapftp怎么用,掌握leapftp的使用方法只需6步
- 非科班、跨行业的如何走前端这条路?
- 浅谈四层交换机技术原理
- php统计结果,使用php怎么统计问卷调查结果
- 开源的在线html编辑器,22个国外的Web在线编辑器收集
- wapl是什么功能?启用有什么用
- SQL Server数据库中创建数据表及数据类型操作应用
- 【ArcGIS】拼接多张栅格图像(将多幅tif影像合成一副)|LUCC数据的拼接
- 妙味课堂H5音乐播放器项目实战 ajax实战教程
- php mcrypt_decrypt,PHP: mcrypt_decrypt - Manual