位运算 |(按位或) (按位与) ^(按位异或)
目录
文章目录:本章讲解的主要是刷题系列
1:首先会介绍 I & ^这三个操作符的作用,性质
2:三道使用位运算操作符的经典 笔试题(来自剑指offer)
题目链接如下:
1:136. 只出现一次的数字 - 力扣(LeetCode)
2:剑指 Offer 15. 二进制中1的个数 - 力扣(LeetCode)
3:剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode)
文章正式开始~~~
1:位运算符 ^(按位异或) &(按位与) |(按位或)
首先我们得理解位运算符中这个位的含意:这个位其实就是我们平常所说的二进制位,所以位运算符是用来针对二进制位(只含有0和1)进行的运算操作符。
&:这个操作符的名字叫做按位与,不要将他与&&(逻辑或)这个操作符弄混淆了,&的作用是将两个操作数二进制位全为1的才是1,其他的位如果有0或1就会将他变成0.(简单的理解就是:全1才为1,否则这一位的值为0).
比如说:3&5
3&5假设在32位平台下
3的二进制位:00000000 00000000 00000000 000000115的二进制位:00000000 00000000 00000000 000001013&5 00000000 00000000 00000000 00000001全1才为1,其它都为0
|(按位或):这个操作符与上面的操作符有异曲同工之妙,只是它的作用与&相反,二进制位上全0才为0,有1就为1.
3|5的结果如下:
3|5
假设在32位平台下
3的二进制位:00000000 00000000 00000000 000000115的二进制位: 00000000 00000000 00000000 00000101
3|5的结果 00000000 00000000 00000000 00000111
^按位异或:二进制位相同的为0,相异的为1 ,与此同时^操作符具有交换律与结合律的特点,比如说:a^a=0 因为二进制位全部相同 a^0=a; 0不会改变它原有的位 a^ b^a=b,这里就体现了它的性质,相当于a^a^ b .
知识点已经铺垫完毕,让我们进入习题的讲解吧。
2:经典笔试题(位运算)
题目的难度是由简单到难的哦!
1: 136. 只出现一次的数字 - 力扣(LeetCode)
这道题也可以称作单身狗问题(dog)
首先这个题目的意思就是:给我们一个数组,然后数组中有一个数只出现了1次,其它的数均出现了2次。
这里我们就可以联想到我们上面所讲的^操作符的性质:a^a=0; 0^a=a;
因为数组中有数字出现了2次,那么我们使用^之后就可以消除这两个相同的数了,到最后数组中留下的数字就是那个唯一出现1次的数字
代码:
int singleNumber(int* nums, int numsSize){int ret =0;int i =0;for(i=0;i<numsSize;i++){ret^=nums[i];}return ret;
}
这道题就很巧妙的使用了^操作符,当然这个题可能还有其它的算法,比如说排序加计数,哈希表...都可以用来实现这个算法。但是我们因为讲的是位操作符,所以就使用了位运算操作符。
2:剑指 Offer 15. 二进制中1的个数
这道题我会用两种解法来讲解这道题:
方法一:移位操作符 加上 &运算符 +计数
思路:假设我们知道一个数因为1的二进制位只有最右边的1位为1其它的位都为0,所以我们将所需要计算数的二进制位的每1位都与1进行&运算
代码:
int hammingWeight(uint32_t n) {int count=0;int i =0;for(i=0;i<32;i++){if(((n>>i)&1)==1)count++;}return count;
}
方法2:将我们所需要求的数的最后一位的1消除,循环进行下去。
思路:n=n&(n-1);
我们举个列子来讲解:
代码实现:
int hammingWeight(uint32_t n) {int count=0;while(n){count++;n=n&(n-1);}return count;
}
3:剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode)
这道题相对于前面两道题就有一定的难度了,并没有上面两道题那么直接:
我们通过实际的列子来进行讲解
我们在这里采用的思想就是分组异或
那么什么又叫分组异或呢?
比如说我们可以把 1 1 3 3 5放在一个数组 把2 2 4 4 6放在另外一个数组,这样我们对每一个数组进行异或就可以得到 5 和6 了。
那么我们如何进行分组呢?
首先我们将数组中的所有数字进行异或得到 5^6,又因为两个数字不可能相等所以异或起来肯定不为1,那么结果中的数二进制位中肯定有一位为1,那么我们就可以利用这个1来进行分组了。
比如5^6
因为5与6在这一位的不同,所以我们将在这一位与5相同的数放进一个组,与5不相同的数我们放到另外的一个数组中,然后分别异或就可以得到答案了。
那么如何找到5与6哪一位不同呢?
首先我们异或整个数组得到5与6的^值,然后将这个值的每一位与1进行&运算,如果找到1位&的结果为1那么我们就可以将这个位置给标记出来,然后再让我们原数组中的每个值移动pos位如果与它&等于1,我们用dog1将它^起来,不等于1那么我们用dog2将它^起来
所以最终我们的dog1为其中的一个值,dog2为其中的第二个值。
代码:
int* singleNumbers(int* nums, int numsSize, int* returnSize){int*ret=(int*)malloc(sizeof(int)*2);int i =0;int pos=0;int a=0;for(i=0;i<numsSize;i++){a^=nums[i];}//a现在为两个数字的异或值 a^b!=0//标记那个位置为1for(i=0;i<32;i++){if(a>>i&1==1){pos=i;break;}}int dog1=0;int dog2=0;//根据pos位置分为两个数组,直接异或就是我们所需要的答案了for(i=0;i<numsSize;i++){if((nums[i]>>pos)&1==1){dog1^=nums[i];}else{dog2^=nums[i];}}ret[0]=dog1,ret[1]=dog2;* returnSize=2;return ret;
}
本章的经典例题讲解完毕,感谢大家的观看~~
如果觉得对你有用的话,可以点个赞哦!!
相关文章:

位运算 |(按位或) (按位与) ^(按位异或)
目录 文章目录:本章讲解的主要是刷题系列 1:首先会介绍 I & ^这三个操作符的作用,性质 2:三道使用位运算操作符的经典 笔试题(来自剑指offer) 题目链接如下: 1:136. 只出现一次的数字 - 力扣(LeetCode…...

Qt应用开发(基础篇)——复选按钮 QCheckBox 单选按钮 QRadioButton
一、前言 QCheckBox类与QRadioButton类继承于QAbstractButton,QCheckBox是一个带有文本标签的复选框,QRadioButton是一个带有文本标签的单选按钮。 按钮基类 QAbstractButton QCheckBox QCheckBox复选框是一个很常用的控件,拥有开关(选中和未…...
AERMOD模型大气环境影响评价
随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果,同时气象因…...
递归组装树结构的数据
开发中,经常遇到存在树形结构的数据,如行政区划这类数据,一级一级分层,后端需要组装好树形结构数据返回给前端。 由于返给前端的json数据中,如果是叶子节点了,说明它没有子节点,那么就没必要返…...

企业架构LNMP学习笔记7
PHP介绍: HTML:超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP:超文本预处理器。后端语言开发,页面上需要动态改变修改的,需要连接数据库查询数据,转为html。 主要…...

开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理
开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理 刚刚安装好开店星网站后台之后都会出现这个code 500[undefined]的错误,需要改一下代码。改好了之后就可以正常使用了。如果大家不懂得这样处理的可以私聊我,帮忙处理…...
第一百三十六回 WillPopScope组件
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了下拉刷新组件相关的内容,本章回中将介绍 WillPopScope组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的WillPopScope组件是一种事件拦截类组件,它没有具…...
【论文爬虫】自动将论文详细信息直送notion并自动下载(含源码)
输入论文标题,本爬虫将自动在semanticscholar.com和arxiv.com搜索该文章,自动获取其日期、作者、url、摘要等信息,并自动发送到你提前设置好的notion数据库里,同时自动从arxiv下载论文,然后将论文的保存地址在notion页…...
Android知识点整理
关键点 Activity Fragment 调试应用 处理应用程序配置 Intent 和 Intent 过滤器 会使用Context 后台处理指南 Android 的数据隐私 Android 网络数据安全教程 Android 中的依赖项注入 内容提供程序 Android 内存管理概览 一些重要的库 1.Glide 是一个 Android 上的…...
JSON与电子表格
一、介绍 电子表格是一种常见的电子数据处理工具,而JSON是一种数据交换格式。电子表格和JSON之间可以进行数据的导入和导出,以实现数据的相互转换和交互。 在电子表格中,数据以行和列的形式组织,并可以包含不同的数据类型。每个…...
Oracle创建用户、授权视图权限
1、创建用户密码 create user 用户名 identified by 密码;2、创建视图 CREATE VIEW 用户1.表名1 AS SELECT * FROM 用户2.表名2 t;3、授权 GRANT SELECT ON 用户2.表名2 TO 用户1 with GRANT OPTION ;grant connect to 用户名; grant select on 用户1.表名1 t…...

MT4移动端应用指南:随时随地进行交易
如今,随着科技的不断发展,我们可以随时随地通过手机进行各种操作,包括进行金融交易。本文将为大家介绍一款优秀的金融交易软件——MT4(可在mtw.so/6gwPno这点下)移动端应用,并提供详细的使用指南࿰…...
【数据挖掘】学习笔记
文章目录 < 数据预处理 > 聚集:多个样本或特征进行合并(减少样本规模、转换标度、更稳定)抽样:抽取一部分样本降维:在地位空间中表示样本(PCA、SVD)特征选择:选取重要特征&am…...

MyBatis-Plus排除不必要的字段
查询学生信息排除年龄列表 📚🔍 使用MyBatis-Plus排除某些字段。如果你想要进行查询,但又不需要包含某些字段,那么这个功能将非常适合你。🔍🎓📝 1. 学生信息查询-排除年龄列表 在使用 MyBat…...

webpack打包
文章目录 一、什么是webpack二、使用步骤1.创建一个新的文件夹,并将其初始化2.在当前目录下安装webpack以及webpack-cli3.配置webpack自定义命令,使之生效4.运行自定义命令,打包webpack5.打包成功之后会将内容打包到dist文件夹下6.配置webpack1)修改webpack打包入口和出口2)配置…...

【Java SE】抽象类与接口
目录 【1】抽象类 【1.1】抽象类概念 【1.2】抽象类语法 【1.3】抽象类特性 【1.4】抽象类的作用 【2】接口 【2.1】接口的概念 【2.2】语法规则 【2.3】接口使用 【2.4】接口特性 【2.5】实现多个接口 【2.6】接口间的继承 【2.7】接口使用实例 【2.8】Clonable …...
HTML <time> 标签
实例 如何定义时间和日期: <p>我们在每天早上 <time>9:00</time> 开始营业。</p><p>我在 <time datetime"2008-02-14">情人节</time> 有个约会。</p>定义和用法 <time> 标签定义公历的时间&…...

C++的向上转型
在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍…...

Android开发-Mac Android开发环境搭建(Android Studio Mac环境详细安装教程,适合新手)...
1.进入Android Studio官网 https://developer.android.google.cn/studio 2.点击下载Android Studio. 3.将说明拉到最下方,选择Mac With Apple Chip.苹果芯片选择Apple Chip,如果是Intel芯片可以选择Intel. 4.下载完成后,双击进入Android Studio. 点击打开. 5.如果是第一次安装,…...

公园气象站:用科技力量,感知气象变化
在城市的喧嚣中,公园成为人们休闲娱乐的宁静之地。而在这些公园中的公园气象站静静地矗立着,不仅为公园的日常运营提供着重要数据,还在为游客的安全保驾护航。 用科技力量,感知气象变化 科技的创新为气象监测提供了更为精准的手…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...