初识算法 · 位运算常见总结(1)

目录

前言:

位运算基本总结

部分题目代码


前言:

​本文的主题是位运算,通过常见的知识点讲解,并且会附上5道简单的题目,5道题目的链接分别为:
191. 位1的个数 - 力扣(LeetCode) 136. 只出现一次的数字 - 力扣(LeetCode)

338. 比特位计数 - 力扣(LeetCode)260. 只出现一次的数字 III - 力扣(LeetCode)

461. 汉明距离 - 力扣(LeetCode)
因为主要是知识点总结,所以题目介绍的不是那么详细,请见谅~

那么,进入主题咯。


位运算基本总结

在C++部分我们其实已经介绍过了位图,对于位图来说,基础自然是位运算了,那么常见的位运算是:

& | ^ >> << ~

有以上六种运算,>>右移运算符<<左移运算符以及~按位取反我们这里不过多介绍了。主要是介绍& | ^。

对于&这个二元运算符来说,两边都为真,那么运算结果为真,也就是全1则1,也可以记忆为有0则0。

对于|这个二元运算发来说,有一边为真,那么运算结果为真,也就是全0则0,也可以记忆为有1则1。

以上的两种记忆方式看同学们自己的理解,没有什么太大的区别。

对于^来说,这个推荐两种记忆方式,两种方式都记住是最好的,一种是相同为0,相异为1,一种是进位相加。

比如1 + 1等于2,但是进位相加之和就是10,所以该位上为0,也可以使用相同为0的这种记法,个人认为进位相加是比较容易理解的一种记法。

基础题目一:给定一个数n,确定它的二进制表示中的第x位是0还是1.

这道题目的思想就是将该x位上的数&上一个1,如果是0,结果就是0,如果是1,结果就是1,如果是用|运算,结果都是1,就没有办法鉴别了。

基础题目二:将一个数的二进制表示的第x位修改成1.

这道题目的思想就是将该x位上的数|上一个1,这样无论是1 还是 0,最后的结果都是1,那么想要
|上这个数字非常简单,只需要将1<<x位即可,我们默认规定一下,一个数字的二进制从右到左的下标是0,和数组下标一样,这样方便表示1 >> x。

基础题目三:将一个数的二进制表示的第x位修改成0.

那这个和2就基本上一样的了,只需要&0就可以了,那么0可以有1<<x之后取反得来,整个结果就有了:

有了上面三道基础题目的基础,我们就可以实现位图了,

位图其实就是一个哈希表,不过之前我们实现哈希表的时候使用的是数组实现的,不过这里我们使用的是int的二进制表示来实现的,我们的操作无非就是0变成1,1变成0,这些基本操作组成了位图。

基本题目四:提取一个数n二进制表示的最右侧的1.

这个题目的别名其实是low bit,也就是低位bit的意思,这道题目没有基本的规律还是比较难思考的,基础做法是n & -n,对于获取-n的基础操作我们是将n全部按位取反之后 + 1即可,那么就可以将n的二进制表示的左边全部变成0,这样右边的1就提取出来了:

基本题目五:干掉一个数n二进制表示的最右侧的1.

这道题目的基础做法是n & n - 1,比如110 & 101,最后的结果就是100,也就将110中最右侧的1干掉了,综上可得,以上两个基础题目是一个类型,这个类型可以衍生出三个题目,分别是191,338,461。

那么有了上面5道题目的基础,我们现在就知道了位的基本运算,可是!位运算的优先级我们知道吗?害,不用知道,库库加括号就对了!

对于异或运算的基本规律我们介绍3点:

1. a ^ a = 0

2. a ^ 0 = 0

3. a ^ b ^ c = a ^ ( b ^ c)

 由这个异或规律,我们可以介绍两个基础题目,136 260。


部分题目代码

class Solution 
{
public:int singleNumber(vector<int>& nums) {int cur = 0;for(int i = 0; i < nums.size(); i++)cur ^= nums[i];return cur;}
};
class Solution {
public:int hammingWeight(int n) {int ret = 0;while(n){n &= (n - 1);ret++;}    return ret;}
};

干掉了多少个1,就代表有多少个1,所以ret++即可。

class Solution 
{
public:int hammingDistance(int x, int y) {x ^= y;int ret = 0;while(x){x &= (x - 1);ret++;}    return ret;}
};

两个不同的异或之后是1,那么问题可以转换为1的个数有多少个。


感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

visualvm远程连接Docker容器中部署的java应用并监控

visualvm远程连接Docker容器中部署的java应用 前言 jdk1.8中自带了&#xff0c;java11中需要单独下载 下载地址 visualvm下载地址 简介 java虚拟机监控&#xff0c;故障排查及性能分析工具。 网络配置 局域网与docker内网打通&#xff0c;请参考&#xff1a;办公网络与Docker内…

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM 文章目录 NVIDIA RTX 系统上使用 llama.cpp 加速 LLMllama.cpp 概述llama.cpp 在 NVIDIA RTX 上的加速性能使用 llama.cpp 构建的开发人员生态系统使用 llama.cpp 在 RTX 平台上加速的应用程序开始使用 适用于 Windows PC 的 NVIDIA …

信息收集系列(二):ASN分析及域名收集

内容预览 ≧∀≦ゞ 信息收集系列&#xff08;二&#xff09;&#xff1a;ASN分析及域名收集前言一、ASN 分析1. 获取 ASN 码2. 使用 ASNMap 获取 IP 范围3. 将 IP 范围转化为 IP 列表 二、关联域名收集1. 顶级域&#xff08;TLD&#xff09;收集测试方法 2. 根域名收集常用方法…

揭秘:b站可以通过弹幕查询到发送者吗?答案是:不可行

查找发送者 发弹幕被找到 最近&#xff0c;我的一个好兄弟遇到了这样一个问题&#xff1a;他在b站发弹幕&#xff0c;结果被人找到了。他对此很困惑&#xff1a;“发送弹幕不是匿名的吗&#xff1f;只有评论才能看到用户名啊&#xff0c;难道发弹幕也可以被找到吗&#xff1f…

安装mysql、Navicat 17

1.安装mysql 下载地址 https://downloads.mysql.com/archives/installer/ 选择最新版本或者你需要的版本 点击第二个Download下载 下载完毕后双击启动&#xff0c;之后是这个页面 选Custom&#xff08;第四个&#xff09;自定义安装&#xff0c;可以将mysql安装到自定义目录…

人工智能助手是否让程序员技能退化?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

RecyclerView进阶知识讲解

在 Android 开发中&#xff0c;RecyclerView 是一种高效的列表和网格布局控件&#xff0c;用于显示大规模数据。尽管基本使用方法简单&#xff0c;但深入理解并掌握其高级进阶用法能大幅提升用户体验和应用性能。下面&#xff0c;我将从布局管理、动画和手势、自定义缓存、优化…

测试用例设计方法之判定表

测试用例设计方法之判定表 1. 为什么要有判定表方法2. 什么是判定表3. 判定表法设计用例步骤4. 判定表使用场景 1. 为什么要有判定表方法 案例: 验证"若用户欠费或者关机, 则不允许主被叫"功能的测试 说明: 等价类和边界值分析法主要关注单个输入类条件的测试并未考…

SpringCloud篇(服务拆分 / 远程调用 - 入门案例)

目录 一、服务拆分原则 二、服务拆分示例 1. 案例需求 2. 案例要求 3. 导入SQL语句 4. 实现思路 4.1. 创建父工程 cloud-demo 管理依赖 依赖导入思路 4.2. 创建子工程 order-servic 4.3. 创建子工程 user-servic 4.4. 创建 cloud_order 数据库和表并插入数据 4.5. …

特征融合篇 | YOLO11改进 | 更换上采样方式之轻量级通用上采样算子CARAFE

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。CARAFE算子的主要特点是在保持轻量级功能的同时&#xff0c;能够提供比其他上采样算子更好的性能。它通过少量的参数和计算量来实现高效的图像上采样。CARAFE算子能够根据像素之间的关系进行自适应的上采样&#xff0c;从而…

Java集合Queue——针对实习面试

目录 Java集合QueueQueue接口的特点是什么&#xff1f;Queue和Deque的区别&#xff1f;ArrayDeque和LinkedList的区别&#xff1f;什么是PriorityQueue&#xff1f;什么是BlockingQueue&#xff1f; Java集合Queue Queue接口的特点是什么&#xff1f; Queue接口在Java中是一个…

【支付宝崩了】复盘

一、背景 2024年11月11日&#xff0c;#支付宝崩了#冲上微博热搜第一 部分网友反映支付宝 App无法正常使用&#xff0c;他们遇到了同一笔订单被扣款三次、余额宝转账至余额后余额显示为0、线下支付后商家未收到款项但银行卡已被扣款等问题。 此外&#xff0c;有网友称支付…

丹摩征文活动|FLUX.1+ComfyUI的详细部署以及实验总结

公主请阅 1. FLUX.1的简介2. 部署过程创建资源ComfyUI的部署操作部署FLUX.1 如何使用&#xff1f;实验总结&#xff1a;环境搭建与工具安装实验步骤实验结果分析总结 1. FLUX.1的简介 FLUX.1 是由黑森林实验室开发的图像生成工具&#xff0c;分为三个版本&#xff1a; FLUX-1-…

基于STM32的智能仓库管理系统设计

引言 本项目基于STM32微控制器设计了一个智能仓库管理系统&#xff0c;通过集成多个传感器模块和控制设备&#xff0c;实现对仓库环境和物资管理的自动化监控。该系统能够实时监测仓库内的温湿度、烟雾浓度等参数&#xff0c;并且通过红外传感器监控人员出入&#xff0c;结合R…

206面试题(47~60)

208道Java面试题 47~60 **208道Java面试题****47. 在 Java 程序中怎么保证多线程的运行安全&#xff1f;****48. 多线程中 synchronized 锁升级的原理是什么&#xff1f;****49. 什么是死锁&#xff1f;****50. 怎么防止死锁&#xff1f;****51. ThreadLocal 是什么&#xff1f…

MySQl基础----Linux下数据库的密码和数据库的存储引擎(内附 实操图和手绘图 简单易懂)

绪论​ 涓滴之水可磨损大石&#xff0c;不是由于他力量强大&#xff0c;而是由于昼夜不舍地滴坠。 只有勤奋不懈地努力&#xff0c;才能够获得那些技巧。 ——贝多芬。新开MySQL篇章&#xff0c;本章非常基础&#xff0c;但同时需要一定的Linux基础&#xff0c;所以假若你没学习…

番外篇 | 关于YOLO11算法的改进点总结

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在2024年9月27日盛大举行的YOLO Vision 2024活动上&#xff0c;Ultralytics公司震撼发布了YOLO系列的最新成员—YOLO11。作为Ultralytics YOLO系列实时目标检测器的最新迭代&#xff0c;YOLO11凭借尖端的准确性、速度和效率…

增长放缓,跨境电商如何以“体验”撬动高转化和高复购?

增长放缓&#xff0c; 跨境电商步入发展新周期 伴随着疫情红利的逐渐收缩&#xff0c;跨境电商市场从野蛮高速增长回归理性&#xff0c;步入新的发展周期&#xff0c;增幅放缓成为新常态。根据eMarketer的统计数据&#xff0c;全球跨境电商销售增长从2020年的26.7%下跌至2022年…

2024“龙信杯“电子数据取证竞赛——计算机取证题目Writeup

以下内容是2024年“龙信杯”电子数据取证竞赛计算机取证题目的答案与解题思路 前置 前置发现电脑中有EFS加密文件&#xff0c;故使用仿真软件保持原有密码进行仿真 1.分析计算机检材&#xff0c;嫌疑人在将其侵公数据出售前在Pycharm中进行了AES加密&#xff0c;用于加密的key…

Linux学习_12

第十一章 管理Linux软件包和进程 主要包括源码下载安装软件&#xff0c;PRM管理工具&#xff0c;YUM/DNF管理工具 源码下载安装软件 源码文件&#xff1a;是指包含计算机程序源代码的文本文件。源代码是用特定编程语言编写的人类可读指令&#xff0c;它描述了计算机程序的逻辑、…