二进制中 1 的个数

1、参考资料

https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/

2、题目要求

题目描述

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

3、代码思路

假设无符号整数 n,根据位运算的定义,有如下规则

  1. (n & 1) == 0,则 n 的最低位为 0
  2. (n & 1) == 1,则 n 的最低位为 1

程序流程:

不停循环右移 n,直到 n == 0,说明 n 中已经没有为 1 的位


注意事项:

  1. 我们需要对 n 进行无符号右移 >>>,无符号右移最高位也会一起移动,高位用 0 补齐
  2. 如果使用普通右移 >>,符号位不会动,剩余的高位用 0 补齐,如果使用普通右移,则导致循环 无法退出

4、代码实现

  1. 代码

    public class CountsOfOneDemo {public static void main(String[] args) {int countsOfOne = countsOfOne(9);System.out.println(countsOfOne);}public static int countsOfOne(int digit) {int count = 0;// 当 digit 中没有任何 1 时,该数将变为 0while (digit != 0) {// digit & 1:如果最低位为 0,则结果为 0;如果最低位为 1,则结果为 1count += digit & 1;// 无符号右移(最高位为符号位,也会一起移动)digit >>>= 1; }return count;}}
    
  2. 程序运行结果

    4
    

题外话

如果输入 -1,其结果是多少呢?程序运行结果:32,分析原因:

  1. 负数在计算机中以补码形式存储
  2. -1 的原码为 1000 0000 0000 0000 0000 0000 0000 0001
  3. -1 的反码为 1111 1111 1111 1111 1111 1111 1111 1110
  4. -1 的补码为 1111 1111 1111 1111 1111 1111 1111 1111
  5. 所以 -1 中有 32 个 1

二进制中 1 的个数相关推荐

  1. C语言中写一个函数返回参数二进制中 1 的个数

    通过C语言程序将十进制数转化成二进制数,然后求出二进制数中1的个数. 下面用三种方法来实现.来 方法一:除2取余法.对一十进制数,用2辗转相除至结果为1,将余数和最后的1从下向上倒序写就是对应的二进制 ...

  2. 统计无符号整数二进制中 1 的个数(Hamming Weight)

    1.问题来源 之所以来记录这个问题的解法,是因为在在线编程中经常遇到,比如编程之美和京东的校招笔试以及很多其他公司都累此不疲的出这个考题.看似简单的问题,背后却隐藏着很多精妙的解法.查找网上资料,才知 ...

  3. 写一个函数返回参数二进制中 1 的个数(三种方法)

    1.运用了除法,取余方式递推出结构 2.运用右移符(>>)运算 3.利用算术与(&)运算 三种方法效率越来越高,减少成本 #include<stdio.h>int Nu ...

  4. 查找两个数储存在二进制中相同的个数

    #include <stdio.h>int main() {int a = 0, b = 0;scanf("%d%d", &a, &b);//输入两数i ...

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

    #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> Fun1(int a) //用移位 ...

  6. JAVA实现输入一个整数,输出该数二进制表示中1的个数(《剑指offer》)

    题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 这个题目有个比较有意思并且被公认的解法,我就先贴答案吧: public class Solution {public int ...

  7. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示

    转自http://my.oschina.net/ithaibo/blog/142655 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目引自http://ac.jobdu ...

  8. 转:对于一个字节(8bit)的变量,求其二进制表示中“1”的个数

    转:http://toutiao.com/a4280977370/ [解法一] 可以举一个八位的二进制例子来进行分析.对于二进制操作,我们知道,除以一个 2,原来的数字将会减少一个0.如果除的过程中有 ...

  9. 算法--微软面试:整数的二进制表示中1的个数(Java实现)

    Q题目 整数的二进制表示中1的个数 输入一个整数,求该整数的二进制表达中有多少个1. 例如,输入10,由于其二进制表示为1010,有两个1,因此输出2. 这是一道很基本的考查位运算的面试题. Answ ...

最新文章

  1. C#中提供的精准测试程序运行时间的类Stopwatch
  2. oracle+root+密码忘记,教您如何修复各种UNIX系统下root密码
  3. VirtualBox下Ubuntu利用桥接方式上网
  4. Linux IPC实践(4) --System V消息队列(1)
  5. java系列2:方法的重载
  6. SCRUM 系列之一 ----- 认识SRCUM
  7. 收藏!Tengine问题排查必备
  8. Linux进程、线程、任务调度(1)贵在坚持
  9. freeradius 3.0 mysql_求助FreeRadius+MySql 配置
  10. 免费开源网站系统有哪些
  11. 华尔街见闻:泰格马克引领未来AI《见面》之旅
  12. MD5不是加密算法,是散列算法
  13. 面向稀有事件的 Logistic Regression 模型校准
  14. LTE-5G学习笔记8---PRACH参数规划
  15. LeetCode——缺失数字(C语言)
  16. mysql小王 保密_街机斗地主小王搓牌
  17. 专家库管理软件专家评审系统_专家系统2 0
  18. 社区物联网医院解决方案(智慧医疗)
  19. Linux Polkit本地权限提升漏洞(CVE-2021-4034)
  20. OpenCart中文开源建站 | 系统界面更新对比(第 1 期)

热门文章

  1. Android 面试 缓存,荐【经典面试题】七大缓存经典问题...
  2. 中国 AI 的“黄埔军校”?MSRA 被曝停招“国防七子”及北邮学生
  3. SOA+AIOT=无限可能,上汽零束AIOT沙龙上海站火热报名中启动
  4. Pascal之父、编程祖师爷尼古拉斯•威茨痛批:教授成了项目经理,大学过于“重论文轻教学“...
  5. 惋惜!42 岁安全研究员、DNS 漏洞发现者去世
  6. 寻优秀开源项目,百万程序员为你助力!
  7. 10 年 Java 老兵宝藏资料,倾情奉献!
  8. 瞧瞧,这样的代码才叫 Pythonic
  9. 编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!| 原力计划...
  10. 滴滴辟谣被美团收购;苹果提交认证 9 款新手机;VS Code 1.46 发布 | 极客头条