当前位置: 首页 > news >正文

位运算 |(按位或) (按位与) ^(按位异或)

目录

文章目录:本章讲解的主要是刷题系列

        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;
}

        本章的经典例题讲解完毕,感谢大家的观看~~

                如果觉得对你有用的话,可以点个赞哦!!

        

相关文章:

位运算 |(按位或) (按位与) ^(按位异或)

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

Qt应用开发(基础篇)——复选按钮 QCheckBox 单选按钮 QRadioButton

一、前言 QCheckBox类与QRadioButton类继承于QAbstractButton&#xff0c;QCheckBox是一个带有文本标签的复选框&#xff0c;QRadioButton是一个带有文本标签的单选按钮。 按钮基类 QAbstractButton QCheckBox QCheckBox复选框是一个很常用的控件&#xff0c;拥有开关(选中和未…...

AERMOD模型大气环境影响评价

随着我国经济快速发展&#xff0c;我国面临着日益严重的大气污染问题。近年来&#xff0c;严重的大气污染问题已经明显影响国计民生&#xff0c;引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因…...

递归组装树结构的数据

开发中&#xff0c;经常遇到存在树形结构的数据&#xff0c;如行政区划这类数据&#xff0c;一级一级分层&#xff0c;后端需要组装好树形结构数据返回给前端。 由于返给前端的json数据中&#xff0c;如果是叶子节点了&#xff0c;说明它没有子节点&#xff0c;那么就没必要返…...

企业架构LNMP学习笔记7

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

开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理

开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理 刚刚安装好开店星网站后台之后都会出现这个code 500[undefined]的错误&#xff0c;需要改一下代码。改好了之后就可以正常使用了。如果大家不懂得这样处理的可以私聊我&#xff0c;帮忙处理…...

第一百三十六回 WillPopScope组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了下拉刷新组件相关的内容&#xff0c;本章回中将介绍 WillPopScope组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的WillPopScope组件是一种事件拦截类组件&#xff0c;它没有具…...

【论文爬虫】自动将论文详细信息直送notion并自动下载(含源码)

输入论文标题&#xff0c;本爬虫将自动在semanticscholar.com和arxiv.com搜索该文章&#xff0c;自动获取其日期、作者、url、摘要等信息&#xff0c;并自动发送到你提前设置好的notion数据库里&#xff0c;同时自动从arxiv下载论文&#xff0c;然后将论文的保存地址在notion页…...

Android知识点整理

关键点 Activity Fragment 调试应用 处理应用程序配置 Intent 和 Intent 过滤器 会使用Context 后台处理指南 Android 的数据隐私 Android 网络数据安全教程 Android 中的依赖项注入 内容提供程序 Android 内存管理概览 一些重要的库 1.Glide 是一个 Android 上的…...

JSON与电子表格

一、介绍 电子表格是一种常见的电子数据处理工具&#xff0c;而JSON是一种数据交换格式。电子表格和JSON之间可以进行数据的导入和导出&#xff0c;以实现数据的相互转换和交互。 在电子表格中&#xff0c;数据以行和列的形式组织&#xff0c;并可以包含不同的数据类型。每个…...

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 &#xff1b;grant connect to 用户名; grant select on 用户1.表名1 t…...

MT4移动端应用指南:随时随地进行交易

如今&#xff0c;随着科技的不断发展&#xff0c;我们可以随时随地通过手机进行各种操作&#xff0c;包括进行金融交易。本文将为大家介绍一款优秀的金融交易软件——MT4&#xff08;可在mtw.so/6gwPno这点下&#xff09;移动端应用&#xff0c;并提供详细的使用指南&#xff0…...

【数据挖掘】学习笔记

文章目录 < 数据预处理 > 聚集&#xff1a;多个样本或特征进行合并&#xff08;减少样本规模、转换标度、更稳定&#xff09;抽样&#xff1a;抽取一部分样本降维&#xff1a;在地位空间中表示样本&#xff08;PCA、SVD&#xff09;特征选择&#xff1a;选取重要特征&am…...

MyBatis-Plus排除不必要的字段

查询学生信息排除年龄列表 &#x1f4da;&#x1f50d; 使用MyBatis-Plus排除某些字段。如果你想要进行查询&#xff0c;但又不需要包含某些字段&#xff0c;那么这个功能将非常适合你。&#x1f50d;&#x1f393;&#x1f4dd; 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> 标签

实例 如何定义时间和日期&#xff1a; <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.如果是第一次安装,…...

公园气象站:用科技力量,感知气象变化

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

i18n-node快速入门:10个简单步骤实现应用国际化 [特殊字符]

i18n-node快速入门&#xff1a;10个简单步骤实现应用国际化 &#x1f30d; 【免费下载链接】i18n-node Lightweight simple translation module for node.js / express.js with dynamic json storage. Uses common __(...) syntax in app and templates. 项目地址: https://g…...

在Jetson Nano上构建海康威视相机Docker镜像:从SDK集成到Python应用部署

1. 环境准备与基础配置 在Jetson Nano上构建海康威视相机Docker镜像的第一步&#xff0c;是确保硬件和基础软件环境就绪。我建议从官方渠道下载最新的JetPack SDK&#xff0c;这个工具包包含了CUDA、cuDNN等深度学习推理必需的组件。安装完成后&#xff0c;记得运行nvidia-smi命…...

VeraCrypt加密卷功能解析与个性化配置指南

VeraCrypt加密卷功能解析与个性化配置指南 【免费下载链接】VeraCrypt Disk encryption with strong security based on TrueCrypt 项目地址: https://gitcode.com/GitHub_Trending/ve/VeraCrypt VeraCrypt作为一款基于TrueCrypt的开源磁盘加密工具&#xff0c;提供了强…...

Waveforms实战指南:基于React的交互式波形可视化深度解析

Waveforms实战指南&#xff1a;基于React的交互式波形可视化深度解析 【免费下载链接】waveforms An interactive, explorable explanation about the peculiar magic of sound waves. 项目地址: https://gitcode.com/gh_mirrors/wa/waveforms 在音频处理、信号分析和数…...

AI净界RMBG-1.4快速上手指南:小白也能轻松搞定透明素材

AI净界RMBG-1.4快速上手指南&#xff1a;小白也能轻松搞定透明素材 1. 为什么你需要这个工具 如果你曾经尝试过用传统软件抠图&#xff0c;一定遇到过这些烦恼&#xff1a;发丝边缘总是有残留背景色、半透明物体抠出来像蒙了一层雾、宠物毛发看起来像被啃过一样参差不齐。AI净…...

location-to-phone-number:如何将电话号码转化为商业智能的地理信息平台

location-to-phone-number&#xff1a;如何将电话号码转化为商业智能的地理信息平台 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gi…...

PyTorch Geometric安装避坑指南:从CUDA版本选择到依赖包自动安装的完整流程

PyTorch Geometric工程化安装指南&#xff1a;从版本匹配到环境复现的深度实践 在深度学习领域&#xff0c;图神经网络(GNN)正成为处理非欧几里得数据的利器&#xff0c;而PyTorch Geometric(PyG)作为最受欢迎的GNN框架之一&#xff0c;其安装过程却常让开发者陷入"依赖地…...

Vivado+Vitis双剑合璧:从零构建Zynq-7020的SD卡Linux系统启动镜像

VivadoVitis双剑合璧&#xff1a;从零构建Zynq-7020的SD卡Linux系统启动镜像 在嵌入式系统开发领域&#xff0c;Xilinx Zynq系列SoC凭借其独特的ARM处理器与FPGA可编程逻辑的完美结合&#xff0c;成为众多高性能嵌入式应用的理想选择。本文将带领开发者深入探索如何利用Vivado和…...

Musicdl革新性全场景音乐解决方案:5个维度揭秘开源音乐下载技术的破局之道

Musicdl革新性全场景音乐解决方案&#xff1a;5个维度揭秘开源音乐下载技术的破局之道 【免费下载链接】musicdl Musicdl: A lightweight music downloader written in pure python. 项目地址: https://gitcode.com/gh_mirrors/mu/musicdl 在数字音乐产业蓬勃发展的今天…...

RMBG-2.0模型量化压缩:减小体积提升速度

RMBG-2.0模型量化压缩&#xff1a;减小体积提升速度 1. 引言 抠图工具RMBG-2.0确实效果惊艳&#xff0c;但原版模型动不动就几个GB的大小&#xff0c;在普通电脑上跑起来慢吞吞的&#xff0c;更别说在手机或边缘设备上部署了。如果你也遇到过模型太大、推理太慢的问题&#x…...