写一个函数返回参数二进制中1的个数--四种方法及原理解释

虽然本方法是java写的,但是其原理适用于大部分语言

方法一:通过取模%运算取出每一位比特位数值,再进行判断(该方法不可判断负数)

原理:

通过取模num % 2 == 1 取出该数的每一个二进制位数,再判断是否等于1

再通过 num /= 2 位移其数值的一个比特位

其中hasNextInt()的用法,请参考另一篇笔记详解Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

如下图,求11二进制中1的个数:

代码如下:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int count = 0;
        if(sc.hasNextInt()) {
            int num = sc.nextInt();
            while(num > 0){
                if(num % 2 == 1){
                    count++;
                }
                num /= 2;
            }
            System.out.println("该数字二进制中1的个数为:" + count);
        }
    }

方法二:右移>>(该方法可判断负数)

原理:

该方法和方法一的原理是类似的,只不过将取模、除等的运算简化为右移了

右移相当于缩小到原来的1/2,二进制最右侧位舍弃,最左侧补符号位(正数补0,负数补1),但是因为每个数字均要判断32次,所以效率不高

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int n = sc.nextInt();
        int count = 0;//记录1的个数
        for (int i = 0; i < 32; i++) {
            if(((n>>i) & 1) == 1){
                count++;
            }
        }
        System.out.println("该数字二进制中1的个数为:" + count);
    }

方法三:无符号右移>>>(该方法可判断负数)

原理:二进制最右侧舍弃,最左侧无论正负数均补0

右移相当于除以2,当 n/2 == 0 时,就没必要再去判断前面多余的数字了,所以效率相对较高

注意:千万不要写成普通右移,普通右移会在左侧位一直补1,导致死循环

 代码如下:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int n = sc.nextInt();
        int count = 0;//记录1的个数
        while(n != 0){
            if((n & 1) == 1){
                count++;
            }
            n >>>= 1;
        }
        System.out.println("该数字二进制中1的个数为:" + count);
    }

方法四:n&(n-1)(该方法可判断负数)

原理:

如果两个数字对应二进制位都是1,则结果为1,否则结果为0

效率高,每次 n&(n-1) 都会少个1,所以有几个1就会&几次,如下图求7二进制中1的个数:

 代码如下:

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int n = sc.nextInt();
        int count = 0;
        while(n != 0){
            n = n & (n-1);
            count++;
        }
        System.out.println("该数字二进制中1的个数为:" + count);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/602978.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python selenium

1.搭建环境 1.安装&#xff1a; pip install msedge-selenium-tools 不要使用pip install selenium&#xff0c;我的电脑上没法运行 2.下载驱动 Microsoft Edge WebDriver |Microsoft Edge 开发人员 edge浏览器点设置---关于即可找到版本号&#xff0c;一定要下载对应版…

不止是搭建 | 极空间虚拟机安装一个可做生产力的Ubuntu桌面系统以及后续优化

不止是搭建 | 极空间虚拟机安装一个可做生产力的Ubuntu桌面系统以及后续优化 哈喽小伙伴们好&#xff0c;偶是Stark-C~ 我在上篇极空间文章中不是给小伙伴们分享了使用虚拟机安装软路由固件『iStoreOS』的教程嘛&#xff1a; 打造Docker完全体&#xff0c; 开箱即用的各类插…

Windows Server 2019虚拟机安装

目录 第一步、准备工作 第二步、部署虚拟机 第三步、 Windows Server 2019系统启动配置 第一步、准备工作 下载Windows Server 2019系统镜像 官网下载地址&#xff1a;Windows Server 2019 | Microsoft Evaluation Center VMware Workstation 17下载地址&#xff1a; 链…

各行业预约上门服务小程序源码系统 在线提交表单+自主接单 带完整的安装代码包以及搭建教程

在当今数字化快速发展的时代&#xff0c;传统行业纷纷寻求与互联网的结合&#xff0c;以提升服务效率和用户体验。为了满足这一需求&#xff0c;罗峰给大家分享一款针对各行业预约上门服务的小程序源码系统。该系统集在线提交表单、自主接单等功能于一体&#xff0c;并附带完整…

C语言贪吃蛇

注 &#xff1a;本文是基于链表实现贪吃蛇游戏 1.Win32 API 本篇文章中实现贪吃蛇会用到一些Win32 API的知识&#xff0c;接下来简单做下介绍 1.1 Win32 API Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c; 它同时也是⼀个 很大的服务中…

熟悉Redis吗,那Redis的过期键删除策略是什么

对于Redis&#xff0c;我们业务开发一般都只关心Redis键值对的查询、修改操作&#xff0c;可能因为懒或者只想能用就行&#xff0c;呵呵。很少关心键值对存储在什么地方、键值对过期了会怎么样、Redis有没什么策略处理过期的键、Redis处理过期键又有什么作用&#xff1f;但这些…

《深入Linux内核架构》第4章 进程虚拟内存(1)

目录 4.1 简介 4.2 进程虚拟地址空间 4.2.1 进程地址空间分布 4.2.2 建立布局 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;订阅后续文章。 第3章讲了两点&#xff1a;物理内存的管理&#xff0c;内核虚拟地址管理。 本章讲&#xff1a;用户进程的虚拟地址空间…

黄金投资怎么判断走势好坏?

投资黄金&#xff0c;就是押注于这一贵金属价格的变动。判断黄金价格的走势好坏&#xff0c;对于投资者来说至关重要。这需要从宏观经济指标、技术分析指标和市场情绪等多元化角度进行综合分析。 宏观经济指标 货币政策&#xff1a;中央银行的货币政策&#xff0c;尤其是利率决…

必应bing国内广告如何开户,怎么收费?

搜索引擎广告作为直接触达潜在客户的有效途径之一&#xff0c;日益受到企业的重视&#xff0c;必应Bing作为全球第二大搜索引擎&#xff0c;在中国市场同样拥有庞大的用户群体&#xff0c;为企业提供了不可忽视的广告投放平台。 一、必应bing国内广告开户流程 1、需求分析与咨…

国产PLC海为如何与电脑通信

前言 这几天接触到了国产海为PLC&#xff0c;做一个记录&#xff01;学习一下&#xff01; 串口联机 步骤 1&#xff1a;使用 USB 转 485 线连接 A8&#xff08;RS485 通讯口&#xff09;和电脑&#xff1b; 步骤 2&#xff1a;打开 Haiwell happy PLC 编程软件&#xff0c…

vcenter7安装nsx

登录控制台 Get services

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

YOLOv9全网最新改进系列:YOLOv9完美融合标准化的注意力模块NAM,高效且轻量级的归一化注意力机制,助力目标检测再上新台阶!

YOLOv9全网最新改进系列&#xff1a;YOLOv9完美融合标准化的注意力模块NAM&#xff0c;高效且轻量级的归一化注意力机制&#xff0c;助力目标检测再上新台阶&#xff01;&#xff01;&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er B站全…

细说夜莺监控系统告警自愈机制

虽说监控系统最侧重的功能是指标采集、存储、分析、告警&#xff0c;为了能够快速恢复故障&#xff0c;告警自愈机制也是需要重点投入建设的&#xff0c;所有可以固化为脚本的应急预案都可以使用告警自愈机制来快速驱动。夜莺开源项目从 v7 版本开始内置了告警自愈模块&#xf…

千元投影仪高性价比机型又出新机?大眼橙C1D上市引领市场新潮流

近年来投影仪技术不断更新迭代&#xff0c;家用智能投影仪市场正迎来一场革新风暴。最明显的就是各家品牌都更快地推出自家的投影仪新品&#xff0c;4月底&#xff0c;极米推出了play5&#xff0c;大眼橙推出了c1d&#xff0c;小明推出了newq3pro……都是千元价位的投影仪新品&…

RabbitMQ基础入门

初识MQ 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能跟多个人同…

Linux的目录结构

什么是路径 在Linux系统中&#xff0c;"路径"指的是文件系统中文件或目录的位置。路径可以是绝对的或相对的。 绝对路径&#xff1a;从根目录&#xff08;即 / &#xff09;开始&#xff0c;描述从根目录到目标文件或目录的完整路径。例如&#xff0c;/usr/local/bi…

SWAT模型【建模方法、实例应用、高级进阶技能】实践

第一部分&#xff1a;SWAT模型实践部分 一、SWAT模型及应用介绍 1.1 面源污染概要 1.2 SWAT模型及应用 1.3 SWAT模型原理 1.4 SWAT模型输入文件 1.5 ArcGIS与SWAT关系 二、SWAT模型中GIS必备技术 2.1 GIS软件平台 2.2 ArcGIS10.6安装和注意事项 2.3 ArcGIS入门 2.…

IT外包能在企业上云时提供什么帮助?

在云计算不断发展的背景下&#xff0c;企业对IT部门的要求日益提高&#xff0c;越来越多的企业开始考虑将IT系统迁移到云上。因此&#xff0c;IT外包也成为企业成功上云的重要支持之一。IT外包在企业上云时具体能提供什么帮助&#xff1f;本文将对此进行详细阐述。 业务重心转移…

Linux磁盘逻辑卷LVM丢失

一.原因&#xff1a;服务器异常断电&#xff0c;重启服务器之后&#xff0c;服务所在的磁盘丢失&#xff0c;逻辑卷也不存在。 二.解决方法&#xff1a; 2.1&#xff09;执行以下命令查看lvm配置文件备份内容&#xff1a; more /etc/lvm/backup/datavg01 datavg是之前使…