二进制中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的个数

    /**计算一个数的二进制中1的个数*/ #include int numberOf1InBinary(const unsigned int a); int numberOf1InBinary_Mask ...

  2. 如何判断一个数的二进制中1的个数(num = (num - 1))

    //可以用下面的方法 int count_one(int num) {int count = 0; //记录1的个数while (num){++count;num &= (num - 1); ...

  3. 剑指offer_第11题_二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数. 其中负数用补码表示. 理解 整数怎么转换为二进制 >>> bin(25) '0b11001' >>> bin ...

  4. python输出二进制数_二进制中1的个数(python)

    题目描述:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析:如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1 ...

  5. 剑指Offer:二进制中1的个数

    题目:输入一个整数,输出该数二进制表示中1的个数. // 二进制中1的个数 #include <stdio.h>int wrong_count_1_bits(int n) // 错误解法: ...

  6. VIPKID:笔试题(数组中和为0的一对数的数量,十进制转二进制中1的个数)

    1. 求数组中的和为0 的一对数的数量 注意,需要用到set import java.util.Scanner;public class Main{public static void main(St ...

  7. 求栈中元素个数算法_精妙的算法——计算二进制中1的个数

    如何计算二进制中1的个数? 全部遍历一遍? 不--不--这不是最优解-- 下面看一段代码: int bitcount (unsigned int n) {int count=0 ;while (n) ...

  8. 《剑指offer》c++版本 15.二进制中1的个数

    如题: 平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1, ...

  9. 整数二进制中1的个数

    要统计一个整数二进制中1的个数,首先我们会想到最简单的方法就是 % 2 再 / 2,然后判断每一位是否为1. 但是,如果这是一个很大的数,频繁的除法运算效率不是很高.而位运算比乘除法效率高,所以我们就 ...

最新文章

  1. 未处理的异常导致基于 ASP.NET 的应用程序意外退出
  2. python3.6 在 windows10 下使用pycrypto
  3. 用rvest包来抓取Google学术搜索数据
  4. linux下mysql中文乱码
  5. HDU 2376 Average distance
  6. (三)SpringMVC实现
  7. QQ密码算法 用于命令行登录
  8. Android之安装开发环境
  9. 3-25构造方法String类中的api
  10. 关于高通平台9008线刷的一些注意点,供小白食用。
  11. leapftp怎么用,掌握leapftp的使用方法只需6步
  12. 非科班、跨行业的如何走前端这条路?
  13. 浅谈四层交换机技术原理
  14. php统计结果,使用php怎么统计问卷调查结果
  15. 开源的在线html编辑器,22个国外的Web在线编辑器收集
  16. wapl是什么功能?启用有什么用
  17. SQL Server数据库中创建数据表及数据类型操作应用
  18. 【ArcGIS】拼接多张栅格图像(将多幅tif影像合成一副)|LUCC数据的拼接
  19. 妙味课堂H5音乐播放器项目实战 ajax实战教程
  20. php mcrypt_decrypt,PHP: mcrypt_decrypt - Manual

热门文章

  1. Linux-NTP-Server+Client
  2. Android适应方案汇总(三)
  3. ewebeditor后台拿shell
  4. 利用ACS实现AAA认证
  5. 转载《Data Guard Broker基础》
  6. 原来JScript中的关键字'var'还是有文章的
  7. 以太坊经典成为第六个加密货币
  8. 在熊市中厚积薄发 比特币现金加大基础设施、应用程序和协议创新力度
  9. QT调用C#写的Dll
  10. 使用Jekyll搭建博客