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

目录

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

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

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

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

        

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现猎人猎物优化算法(HPO)优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

肖sir__设计测试用例方法之等价类02_(黑盒测试)

设计测试用例方法之等价类02_&#xff08;黑盒测试&#xff09; 一、掌握常用的设计方法: 黑盒测试方法&#xff1a;等价类、边界值&#xff0c;状态迁移法、场景法、判定表、因果图、正交表&#xff0c;&#xff08;7种&#xff09; 经验测试方法&#xff1a;错误推测法、异常…

iOS 17中的Safari配置文件改变了游戏规则,那么如何设置呢

Safari在iOS 17中最大的升级是浏览配置文件——能够在一个应用程序中创建单独的选项卡和书签组。这些也可以跟随你的iPad和Mac&#xff0c;但在本指南中&#xff0c;我们将向你展示如何使用运行iOS 17的iPhone。 你可能有点困惑&#xff0c;为什么Safari中没有明显的位置可以添…

*** error 65: access violation at 0xFFFFFFF4 : no ‘write‘ permission怎么办

我发现是我的单片机型号设置错了&#xff0c;把debug里面的STM32F103ZET6修改为STM32F103ZE就可以正常运行了

android:新建工程文件介绍

一、前言当我们新建一个app时会呈现出固定的工程文件&#xff0c;这篇文章介绍新建工程里的文件。 二、介绍 Structure:就是你选择哪个页面就会显示那个页面的结构&#xff0c;就比如说我选择的是MainActivity他就会显示这个页面所使用的方法。 1-2&#xff1a;是android自动生…

手写apply方法

<script>/** 手写apply方法 * */Function.prototype.myApply function (context, args) {console.log(this, sss)//fnconst key Symbol()context[key] thiscontext[key](...args)delete context[key]return context[key]}const obj {name: zs,age: 18}function fn …

软件测试/测试开发丨Web自动化 测试用例流程设计

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…

mysql文档--默认存储引擎--innodb存储引擎--innodb引擎全解

阿丹&#xff1a; 在mysql中innodb是默认的存储引擎。研究一下为什么它会被独宠。 官方解释&#xff1a; InnoDB&#xff0c;是MySQL的数据库引擎之一&#xff0c;现为MySQL的默认存储引擎&#xff0c;为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发&#xf…

镜像的基本命令(docker)

文章目录 前言一、docker命令介绍1、帮助命令2、显示镜像3、搜索镜像4、下载镜像5、删除镜像 总结 前言 本文主要介绍docker中与镜像相关的一些命令&#xff0c;是对狂神课程的一些总结&#xff0c;作为一个手册帮助博主和使用docker的同学们来查找和回忆。 实验环境&#xf…

Vue + Element UI 实现权限管理系统 前端篇(四):优化登录流程

完善登录流程 1. 丰富登录界面 1.1 从 Element 指南中选择组件模板丰富登录界面&#xff0c;放置一个登录界面表单&#xff0c;包含账号密码输入框和登录重置按钮。 <template><el-form :model"loginForm" :rules"fieldRules" ref"loginFo…

机器人中的数值优化(十三)——QP二次规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

【MySQL】MySQL 慢SQL如何避险

我们在日常开发中&#xff0c;一定遇见过某些SQL执行较慢的情况&#xff0c;我们俗称“慢SQL”&#xff0c;如果你对系统的接口性能要求较高的话&#xff0c;一定不会放过这种SQL&#xff0c;肯定会想办法进行解决&#xff0c;那么&#xff0c;导致慢 SQL 出现的原因&#xff0…