【优先算法】专题——位运算
在讲解位运算之前我们来总结一下常见的位运算
一、常见的位运算
1.基础为运算
<< &:有0就是0
>> |:有1就是1
~ ^:相同为0,相异位1 /无进位相加
2.给一个数 n,确定它的二进制表示中的第x 位是0还是1
n:0 1 1 0 1 0 1 0 0 1
(n >> x) & 1
3.将一个数n的二进制表示的第x位修改成1
x
0 1 1 0 1 0 1 0 1 1
0 0 0 0 0 1 0 0 0 0
0 1 1 0 1 1 1 0 1 1(使用|)
n |=(1 << x)
n = n | (1 << x)
4.将一个数n的二进制表示的第x位修改成0
x
0 1 1 0 1 0 1 1 0 0
1 1 1 1 0 1 1 1 1 1(取反得到:0 0 0 0 0 1 0 0 0 0)
0 1 1 0 0 0 1 1 0 0(使用&)
n &= (~(1<<x))
n = n &(~(1<<x))
5.位图思想
我们可以使用一个哈希表来存储我们的信息方便我们增删查改主要还是为了 我们查找因为可以使用O(1)的时间复杂度来查找,但是现在我们可以使用一个int变量来进行,一个int类型4个字节32个bit位,我们可以用某一位bit位上的0或者1来表示我们的信息,0表示一个信息1表示一个信息,本质还是一个哈希表。
位图会大量用到我们2、3、4这几个操作,专门为位图服务
6.提取一个数(n)二进制中最右侧的1
n & -n 将最右侧的1,左边的区域全部变成相反
0 1 1 0 1 0 1 0 0 0(原码)
1 0 0 1 0 1 0 1 1 1(反码)
1 0 0 1 0 1 1 0 0 0(+1,补码)
0 1 1 0 1 0 1 0 0 0(原码)
0 0 0 0 0 0 1 0 0 0(原码和补码进行&)
7.干掉一个数(n)二进制表示中最右侧的1
n & (n-1)将最右侧的1,右边的区域(包含1)全部变成相反
n : 0 1 1 0 1 0 1 0 0
n -1:0 1 1 0 1 0 0 1 1
& 0 1 1 0 1 0 1 0 0
___________________
0 1 1 0 1 0 0 0 0
8.位运算的优先级
能加括号就加括号
9.异或(^)运算的运算律
1.a ^ 0 = a
2.a ^ a = 0(消消乐)
3.a ^ b ^ c = a ^(b ^ c)
一个奇数,一堆偶数最终的结果为奇数,因为偶数抵消了为0
通过上面的总结我们可以尝试写一下如下五个题
191.位一个的个数
题目链接:位一个的个数
题目描述:
参考代码:
class Solution {
public:int hammingWeight(int n) {int count = 0;while(n != 0) {count++;n = n & (n-1);//把最低位1的右边互为相反数(包含1)}return count;}
};
338.比特位计数
题目链接:比特位计数
题目描述:
参考代码:
class Solution {
public:vector<int> countBits(int n) {vector<int>ans(n+1,0);for(int i = 1;i <= n;i++){ans[i] = ans[i>>1] + (i & 1);}return ans;}
};
461.汉明距离
题目链接:汉明距离
题目描述:
参考代码:
//对应的位置值不相同的个数。例如,假设有两个十进制数a=93和b=73,
// 如果将这两个数用二进制表示的话,有
// a=1011101
// b=1001001,
// 可以看出,二者的从右往左数的第3位、第5位不同(从1开始数)
// 因此,a和b的汉明距离是2。
class Solution {
public:int hammingDistance(int x, int y) {int s = x ^ y, ret = 0;while (s){ret += s & 1;s >>= 1;}return ret;}
};
136.只出现一次的数字
题目链接:只出现一次的数字
题目描述:
参考代码:
class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(auto n :nums){ret ^= n;}return ret;}
};
260.只出现一次的数字|||
题目链接:只出现一次的数字|||
题目描述:
参考代码:
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {unsigned int s = 0;for(auto n : nums){s ^= n;}int low = s & -s;//取出最右侧的1int a = 0,b = 0;for(auto n : nums){if((low & n) == low){a ^= n;}else{b ^= n;}}return vector<int>{a,b};}
};
二、判断字符是否唯一
题目链接:判断字符是否唯一
题目描述:
解法一:我们可以使用哈希表
class Solution1 {
public:bool isUnique(string astr) {unordered_set<int>hash;for (auto ch : astr){if (hash.count(ch)) return false;hash.emplace(ch);}return true;}
};
解法二:位图
我们用0表示没出现过,1表示出现过
可以利用鸽巢原理来进行优化,鸽巢原理已经在双指针那里讲过了这里就不过多赘述,一共有26个字母如果字符串的长度超过则肯定有重复字符,如果字符串的长度大于26那么直接返回false
参考代码:
class Solution {
public:bool isUnique(string astr) {//利用鸽巢原理来做的优化if (astr.size() > 26) return false;int bitMap = 0;for (auto ch : astr){int i = ch - 'a';//判断字符是否已经出现过if ((bitMap >> i) & 1 == 1) return false;//把当前字符加入位图中bitMap |= 1 << i;}return true;}
};
三、丢失的数字
题目链接:丢失的数字
题目描述:
解法一:哈希表
创建一个哈希表然后遍历数组,0出现标记一下,1出现标记一下,3出现标记一下....
解法二:高斯求和
(首项 + 尾项) * 项数 / 2这样就算出了0~5的和然后我们再减去数组里面所有数之和这样就得出来了
参考代码:
class Solution1 {
public:int missingNumber(vector<int>& nums) {int n = nums.size();int sum = n * (n + 1) / 2;int ret = 0;for (auto n : nums){ret += n;}return sum - ret;}
};
解法三:位运算(异或运算的运算律)
参考代码:
class Solution {
public:int missingNumber(vector<int>& nums){int ret = 0;for (int i = 0; i <= nums.size(); i++) ret ^= i;for (auto n : nums) ret ^= n;return ret;}
};
四、两整数之和
题目链接:两整数之和
题目描述:
在笔试中我们不讲武德直接return a + b;
解法:位运算(异或运算-无进位相加)
13+28=41
a: 0 0 1 1 0 1
b: 0 1 1 1 0 0
——————————
a^b: 0 1 0 0 0 1(a) 无进位
进位(a & b)<<1 0 1 1 0 0 0 我们进位是往前进位所以这里我们右移一位
我们继续重复如上操作,先无进位相加再进位
a: 0 1 0 0 0 1
b: 0 1 1 0 0 0
a^b: 0 0 1 0 0 1 无进位
(a & b) <<1 1 0 0 0 0 0 进位
a: 0 0 1 0 0 1
b : 1 0 0 0 0 0
a^b: 1 0 1 0 0 1 无进位 41
(a & b) <<1 0 0 0 0 0 0 进位
进位变成0就结束了,最后的无进位相加就是我们的最终结果
参考代码:
class Solution {
public:int getSum(int a, int b) {while(b != 0){int x = a ^ b;//无进位相加unsigned carry = (unsigned)(a & b) <<1;//算出进位a = x;b = carry;}return a;}
};
五、只出现一次的数字||
题目链接:只出现一次的数字||
题目描述:
设要找的数位 ret ,由于整个数组中,需要找的元素只出现了⼀次,其余的数都出现三次,因此我们可以根据所有数的某⼀个⽐特位的总和 %3 的结果,快速定位到 ret 的⼀个⽐特位上的值是 0 还是 1 。 这样,我们通过 ret 的每⼀个⽐特位上的值,就可以将 ret 给还原出来。
参考代码:
class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(int i = 0;i < 32;i++){int sum = 0;for(int x : nums)if(((x>>i) & 1) == 1)sum++;sum %= 3;if(sum == 1) ret |= 1<<i;}return ret;}};
六、消失的两个数字
题目链接:消失的两个数字
题目描述:
这道题其实是丢失的数字+只出现一次的数字|||融合一起,本题的算法原理就是用到了这两道题的一个算法原理。
nums中消失了两个数字,1~N这堆数中假设a和b是消失的两个数字,nums这一堆数和1~N这一堆数异或,其他的数出现了2次a和b出现了一次,那么其实就是a ^ b
解法:位运算
1.将所有的数异或在一起,tmp
tmp = a ^ b
2.找到tmp中,比特位上为1的那一位
a^b的结果肯定不为0因为他们是不同的数,所以它们的比特位上肯定有一位是1,a和b的第x位上肯定是不同的
3.根据x位的不同,划分成两类异或
我们可以把x位是0的分为一类,x位上是1的分一类,然后对两组数据分别进行异或。
参考代码:
class Solution {
public:vector<int> missingTwo(vector<int>& nums) {//1.把所有数异或起来int tmp = 0;for(auto n : nums) tmp ^= n;for(int i = 1;i<=nums.size()+2;i++) tmp ^= i;int diff = 0;//找出a,b比特位不同的那一位while(1){if(((tmp >>diff) & 1) == 1) break;else diff++;}//3.根据diff位的不同,将所有数划分两类来异或int a = 0,b = 0;for(auto n : nums)if(((n >> diff) & 1) == 1) b ^= n;else a ^= n;for(int i = 1;i<=nums.size()+2;i++){if(((i >> diff) & 1) == 1) b ^= i;else a ^= i;}return {a,b};}
};
相关文章:

【优先算法】专题——位运算
在讲解位运算之前我们来总结一下常见的位运算 一、常见的位运算 1.基础为运算 << &:有0就是0 >> |:有1就是1 ~ ^:相同为0,相异位1 /无进位相加 2.给一个数 n,确定它的二进制表示…...

qt.qpa.plugin: Could not find the Qt platform plugin “dxcb“ in ““
个人博客地址:qt.qpa.plugin: Could not find the Qt platform plugin "dxcb" in "" | 一张假钞的真实世界 我遇到的场景是,在Deepin系统终端中运行PySide应用时,没有错误提示,但在VS Code中运行时ÿ…...

1-刷力扣问题记录
25.1.19 1.size()和.length()有什么区别 2.result.push_back({nums[i], nums[left], nums[right]});为什么用大括号? 使用大括号 {} 是 C11 引入的 初始化列表 语法,它允许我们在构造或初始化对象时直接传入一组值。大括号的使用在许多情况下都能让代码…...

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】
物联网(IoT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术,实时采集并连接任何需要监控、连接、互动的物体或过程,实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…...
【单层神经网络】基于MXNet的线性回归实现(底层实现)
写在前面 基于亚马逊的MXNet库本专栏是对李沐博士的《动手学深度学习》的笔记,仅用于分享个人学习思考以下是本专栏所需的环境(放进一个environment.yml,然后用conda虚拟环境统一配置即可)刚开始先从普通的寻优算法开始ÿ…...

unity中的动画混合树
为什么需要动画混合树,动画混合树有什么作用? 在Unity中,动画混合树(Animation Blend Tree)是一种用于管理和混合多个动画状态的工具,包括1D和2D两种类型,以下是其作用及使用必要性的介绍&…...
《基于deepseek R1开源大模型的电子数据取证技术发展研究》
《基于deepseek R1开源大模型的电子数据取证技术发展研究》 摘要 本文探讨了基于deepseek R1开源大模型的电子数据取证技术发展前景。随着人工智能技术的快速发展,AI大模型在电子数据取证领域的应用潜力日益凸显。本研究首先分析了电子数据取证的现状和挑战…...

Potplayer常用快捷键
Potplayer是一个非常好用的播放器,功能强大 功能快捷键播放/暂停空格键退出Esc下一帧F上一帧D快进10秒→快退10秒←快进30秒Ctrl →快退30秒Ctrl ←快进1分钟Alt →快退1分钟Alt ←增加播放速度C减少播放速度X恢复正常速度Z增加音量↑减少音量↓静音M显示/隐藏字幕Ctrl A…...

C++ Primer 自定义数据结构
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...

35.Word:公积金管理中心文员小谢【37】
目录 Word1.docx Word2.docx Word2.docx 注意本套题还是与上一套存在不同之处 Word1.docx 布局样式的应用设计页眉页脚位置在水平/垂直方向上均相对于外边距居中排列:格式→大小对话框→位置→水平/垂直 按下表所列要求将原文中的手动纯文本编号分别替换…...

北京钟鼓楼:立春“鞭春牛”,钟鼓迎春来
仁风导和气,勾芒御昊春。“钟鼓迎春”立春鞭春牛民俗体验活动于立春当日在北京钟鼓楼隆重举办。此次活动由北京市钟鼓楼文物保管所主办,京睿文(北京)文化科技有限公司承办,通过礼官报春、击鼓鸣钟、春娃喊春、中国时间文化角色巡游、鞭春牛等一系列精彩的活动环节,为观众呈现了…...

股票入门知识
股票入门(更适合中国宝宝体制) 股市基础知识 本文介绍了股票的基础知识,股票的分类,各板块发行上市条件,股票代码,交易时间,交易规则,炒股术语,影响股价的因素…...

Java自定义IO密集型和CPU密集型线程池
文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue(实现 核心线程->最大线程数->队列) 场景1:CPU密集型场景思路&…...

Git的安装步骤详解(复杂的安装界面该如何勾选?)
目录 一、下载与安装 1.官网下载git 2、下载完成之后,双击下载好的exe文件进行安装 3、选择Git的安装路径 4、选择在安装 Git 时要包含的组件和功能 5、选择 Git 快捷方式在 Windows 开始菜单中的位置。 6、选择 Git 使用的默认编辑器 7、调整新仓库中初始分…...
文本预处理
一、文本的基本单位 1、Token 定义:文本的最小单位,例如单词、标点符号。 示例: 原句: "I love NLP." 分词结果: [I, love, NLP, .] 2、语法与语义 语法:词的结构和句子的组合规则。 语义&a…...

SQLAlchemy 2.0的简单使用教程
SQLAlchemy 2.0相比1.x进行了很大的更新,目前网上的教程不多,以下以链接mysql为例介绍一下基本的使用方法 环境及依赖 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步骤 1、创建引擎,链接到mysql engine crea…...
基于RAG的知识库问答系统
基于RAG的知识库问答系统 结合语义检索与大语言模型技术,实现基于私有知识库的智能问答解决方案。采用两阶段处理架构,可快速定位相关文档并生成精准回答。 核心功能 知识向量化引擎 支持多语言文本嵌入(all-MiniLM-L6-v2模型)自…...

SQL/Panda映射关系
Pandas教程(非常详细)_pandas 教程-CSDN博客 SQL:使用SELECT col_1, col_2 FROM tab; Pandas:使用df[[col_1, col_2]]。 SQL:使用SELECT * FROM tab WHERE col_1 11 AND col_2 > 5; Pandas:使用df…...

自定义数据集 使用paddlepaddle框架实现逻辑回归
导入必要的库 import numpy as np import paddle import paddle.nn as nn 数据准备: seed1 paddle.seed(seed)# 1.散点输入 定义输入数据 data [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6…...
Docker入门篇(Docker基础概念与Linux安装教程)
目录 一、什么是Docker、有什么作用 二、Docker与虚拟机(对比) 三、Docker基础概念 四、CentOS安装Docker 一、从零认识Docker、有什么作用 1.项目部署可能的问题: 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题࿱…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...