算法通关村——位运算之位移的妙用
位移的妙用
1、位1的个数
1.1、题目描述
LeetCode191. 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位为 ‘1’ 的个数。
示例1:
输入:00000000000000000000000000001011
输出:3
示例2:
输入:00000000000000000100000000000000
输出:1
1.2、问题分析与解答
首先我们可以根据题目要求直接计算,题目给定的n是32位二进制表示下的一个整数,计算位1的个数的最简单的方法就是遍历n的二进制表示的每一位,判断每一位是否为1,同时进行计数。
那么怎么判断某一位是否为1呢?例如:00001001001000100001100010001001,首先我们注意要识别到最低位的1,可以这么做:
00001001001000100001100010001001& 00000000000000000000000000000001= 00000000000000000000000000000001
也就是说将原始数字和1进行与运算就能知道最低位是不是为1了,那其他位置该怎么算呢?
第一种思路是让原始数据不断右移或者是让1不断左移。例如将原始数据右移1位:
00000100100100010000110001000100& 00000000000000000000000000000001= 00000000000000000000000000000000
很显然此时可以判断出第二位是0,然后依次将原始数据右移就能判断出每个位置是否为1了。因此是不是1,计算一下(n >> i) & 1就可以了,代码如下:
public int hammingWeight(int n) {int count = 0;for (int i = 0; i < 32; i++) {count += (n >> i) & 1;}return count;
}
除了上述方法外,还有一种方法:
按位与运算有一个性质:对于整数n,计算n & (n - 1)的结果为将n的二进制表示的最后一个1变为0。
利用这条性质,令n = n & (n - 1),则n的二进制表示中的1的数量减少一个。重复该操作,知道n的二进制表示中的全部数位变为0,则操作次数即为n的位1的个数,还是看上面的例子:
n: 00000100100100010000110001000100
n-1: 00000100100100010000110001000011
n&(n-1): 00000100100100010000110001000000
可以看到此时n&(n-1)的结果比上一个n少了一个1,如果一直循环执行的话,到最后n等于0时退出循环,这时循环的次数就是原来n中1的个数,代码如下:
public int hammingWeight(int n) {int count = 0;while (n != 0) {n = n & (n - 1);count++;}return count;
}
2、比特位计数
2.1、问题描述
LeetCode338. 给你一个整数n,对于 0 <= i <= n 中的每一个i,计算其二进制表示中1的个数,返回一个长度为n + 1的数组ans作为答案。
示例:
输入:n=2
输出:[0, 1, 1]
解释:0到n有0,1,2三个数字,每个数字含有1的个数分别为0 1 1个,如下:
0 --> 0
1 --> 1
2 --> 10
2.2、问题分析与解答
本题是上题的扩展,可以直接遍历0到n的每个数,在遍历的过程中对每个数计算其位1的个数。
代码如下:
public int[] countBits(int n) {int[] bits = new int[n + 1];for (int i = 0; i <= n; i++) {bits[i] = countOnes(i);}return bits;
}public int countOnes(int x) {int ones = 0;while (x > 0) {x = x & (x - 1);ones++;}return ones;
}
相关文章:
算法通关村——位运算之位移的妙用
位移的妙用 1、位1的个数 1.1、题目描述 LeetCode191. 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位为 ‘1’ 的个数。 示例1: 输入:00000000000000000000000000001011 输出࿱…...
【开题报告】基于uni-app的高校新生报道APP的设计与实现
1.选题背景和意义 随着高校规模的不断扩大和信息化技术的迅速发展,传统的高校新生报道方式已经无法满足日益增长的新生数量和信息处理的需求。传统的线下报道流程通常存在着信息收集效率低、报到流程繁琐等问题,给学生、教职工和管理人员带来了许多不便…...

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据
在我们创建 Elasticsearch 进行开发时,最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时,特别是在准备测试环境时,开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…...

<文件操作及常用的API>
文章目录 专栏导读🚀简单认识一下文件🚀树形结构和目录🚀文件路径-相对路径、绝对路径🚀文件类型🚀Java中文件的操作🚀File 类的常用方法 专栏导读 🚀多线程章节 💐数据结构剖析 &am…...

深入探讨Linux中的文本文件查看命令
目录 前言1 cat命令2 less命令3 more命令4 head命令5 tail命令6 总结 前言 在Linux系统中,文本文件是日常工作中不可或缺的一部分,无论是配置文件、日志文件还是代码文件,都需要用到文本文件查看命令。在本文中,我们将深入研究一…...

asp.net企业员工档案信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
一、源码特点 asp.net企业员工档案信息管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 asp.net企业员工档案信息管理系统 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&…...
WPF中的xmlns 和xmlns:x有什么区别?
WPF (Windows Presentation Foundation) 中的 xmlns 和 xmlns:x 是XML命名空间的声明,它们在XAML(eXtensible Application Markup Language)中被广泛使用。XAML是WPF、Silverlight、Xamarin.Forms等技术中用于定义UI元素的标记语言。 xmlns: …...
为什么流量卡禁区多,而手机卡却可以用呢?
很多朋友比较关心流量卡禁区的问题,当我们申请流量卡时,运营商都会在套餐详情中标明具体的禁发地区,这个时候很多朋友都会有疑问了,为什么流量卡不能用的地区,可以申请到手机卡呢。 想要清楚这个问题࿰…...
Linux 桌面应用
Part I: Linux 系统概述 什么是 LinuxLinux 的历史和版本Linux 发行版介绍Linux 的优缺点 Part II: Linux 安装与配置 5. 硬件要求与准备工作 6. 安装 Linux 操作系统 7. Linux 系统初始化设置 8. Linux 系统更新与升级 9. Linux 基础配置 Part III: Linux 命令行 10. Linux…...

NLP领域的突破催生大模型范式的形成与发展
当前的大模型领域的发展,只是范式转变的开始,基础大模型才刚刚开始改变人工智能系统在世界上的构建和部署方式。 1、大模型范式 1.1 传统思路(2019年以前) NLP领域历来专注于为具有挑战性的语言任务定义和设计系统,…...

大模型的全面回顾,看透大模型 | A Comprehensive Overview of Large Language Models
大模型的全面回顾:A Comprehensive Overview of Large Language Models 返回论文和资料目录 论文地址 1.导读 相比今年4月的中国人民大学发表的大模型综述,这篇综述角度更侧重于大模型的实现,更加硬核,更适合深入了解大模型的一…...
【瑞禧分享】碳化硅纳米线 SiC纳米线 <100nm SiC晶须 SiC短纤维
碳化硅纳米线 规格或纯度:线/晶须含量:99% 供应商:西安瑞禧生物 英文名称:SiC Nanowire 别名:碳化硅纳米线,SiC晶须,SiC短纤维,SiC纳米线 英文别名:SiC Nanowire,SiC whiskers,SiC fiber 介绍&#x…...

P3371 【模板】单源最短路径(弱化版)
【模板】单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路…...

一文入门Springboot+actuator+Prometheus+Grafana
环境介绍 技术栈 springbootmybatis-plusmysqloracleactuatorPrometheusGrafana 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 本地主机应用 192.168.1.9:8007 PrometheusGrafana安装在同一台主机 http://…...

基于Qt 多线程(继承 QObject 的线程)
继承 QThread 类是创建线程的一种方法,另一种就是继承QObject 类。继承 QObject 类更加灵活。它通过 QObject::moveToThread()方法,将一个 QObeject的类转移到一个线程里执行。恩,不理解的话,我们下面也画个图捋一下。 通过上面的图不难理解,首先我们写一个类继承 QObj…...

图论11-欧拉回路与欧拉路径+Hierholzer算法实现
文章目录 1 欧拉回路的概念2 欧拉回路的算法实现3 Hierholzer算法详解4 Hierholzer算法实现4.1 修改Graph,增加API4.2 Graph.java4.3 联通分量类4.4 欧拉回路类 1 欧拉回路的概念 2 欧拉回路的算法实现 private boolean hasEulerLoop(){CC cc new CC(G);if(cc.cou…...

(一)什么是Vite——vite介绍与使用
什么是Vite Vite(法语意为 "快速的",发音 /vit/,发音同 "veet")是一种新型前端构建工具,能够显著提升前端开发体验。 它主要由两部分组成: 一个开发服务器,它基于 原生 …...
直流电动机四象限运行控制变流器设计
摘 要 节能和效率是工业经济发展的主题,电机在各行各业都是主要的动力来源, 直流电机以其控制简单,效率高,功率密度大等优势脱颖而出。基于直流电动机四象限运行控制变流器应用广泛,比如电子设备、电机控制、工业等行…...

虹科示波器 | 汽车免拆检修 | 2021款广汽丰田威兰达PHEV车发动机故障灯异常点亮
一、故障现象 一辆2021款广汽丰田威兰达PHEV车,搭载A25D-FXS发动机和动力蓄电池系统(额定电压为355.2V,额定容量为45.0Ah),累计行驶里程约为1万km。车主反映,高速行驶时发动机突然抖动,且发动机…...
机器学习和深度学习领域的算法和模型
机器学习和深度学习领域有许多算法和模型,以下是一些常见的算法和模型: 线性回归(Linear Regression)逻辑回归(Logistic Regression)决策树(Decision Tree)随机森林(Ran…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...