算法学习:第一天-------位运算

news2024/11/18 12:27:00

前言

位运算是在算法设计中的一种非常重要和高效的方法,常见的有与运算,非运算,异或运算。我们常用的比较多的可能就是异或运算,又叫无进位相加。

1.1 取非运算----(~)

取非运算其实就是和我们的无符号数取反码类似,就是将数对应的二进制所有位取反,0变为1,1变为0;

如15的二进制形式为1111 ,则15的非~15就是为0000
如17的二进制形式10001 , 则17的非~17就是01110

1.2与运算-----(&)

与运算就是只有当两个数同时为1时最后结果才会为1,否则只要有一放为0,则最终结果就为0;

如15的二进制形式为1111 ,如17的二进制形式10001 
则15&17=1111&10001=00001,最终结果为1

1.3异或运算-----(^)

这里异或符号就是我们机组中的圈里面一个+,异或叫无进位相加。指的是0异或任何数都为任何数,任何数异或本身都为0。异或运算满足结合律

0^0=0,   1^1=0,     0^1=1

2. 位运算相关运用

2.1. 交换两个数据

我们可以利用异或运算的特性来交换两个数的位置,而不需要开辟多余空间,更重要的是位运算的速率是非常快的。

a=a^b  //改行执行后 a=a^b  b=b
b=a^b //改行执行后 a=a^b  b=a^b^b=a
a=a^b //改行执行后 a=a^b^a=b  b=a
    public  static void fun(int a ,int b){
        System.out.println("交换前"+a+",,,,,"+b);
        a=a^b;
        b=a^b;
        a=a^b;
        System.out.println("交换后"+a+",,,,,"+b);
    }

则最后成功交换过来了。
在这里插入图片描述
在这里插入图片描述

用为交换两个数时,两个数的值是可以相同的,但是两个数不能指向同一个内存,你要指向同一个内存就相当于对同一个数进行异或运算,最后结果就会被消为0.
在这里插入图片描述

2.2 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这一个数

当一组数只有一个数出现了,奇数次则寻找起来还是比较简单的,直接将所有数异或就可以了。
比如为a,b,b,b,b,c,c,d,d.
相同数异或为0.则偶数个相同的数异或在一起就是为0.则最后就只会保留那个出现奇数次的数。

    public static  int findodd(int a[]){
        int count=0;
        for (int x:a){
            count^=x;
        }
        return count;
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到这两个数

当出现了两个奇数次数,方法相同只是多加了一步。首先还是先将所有的数都异或到一起。结果为哪两个奇数次的异或。
如a,b,c,c,d,d,e,e,f,f.
这全部异或到一起的结果为a^b用eor表示。
因为a和b为两个不同的数,这eor一定不会为0.既然不为0,这eor所表示的二进制必定存在一位为1,假设第三位为1.eor=xxxxxx100.这是eor所表示的二进制位,第三位不为0.然后我们就可以帮所有的数分为两类,一类为第三位为1,一类为第三位为0.因为第三位不是1就一定是0.
**且两个奇数次数一定分布在两个不同的区域里。
在这里插入图片描述

然后将第三位为0的这一区域所有数异或起来。用eor1表示为a或b
则最终eor=a^b, eor1=a或b.
则若eor1=a 则eor^eor1=b
则若eor1=b 则eor^eor1=a.
则最终两个数为eor1和eor1^eor.

2.3.1 如何找到第一位不为0,也就是说你怎么找到a^b的第三位。

这里就需要用到一个公式,找到右侧第一位不为0的数。

int right=eor&(~eor+1);  //取出最右侧不为0的数
如eor=1000100,
~eor=0111011+1=0111100&1000100=0000100

代码为

//    一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到这两个数
    public  static  void findTwoOdd(int a[]){
        int eor=0;
        int eor1=0;
        for(int i:a){
            eor=eor^i;
        }
        int right=eor&(~eor+1);  //取出最右侧不为0的数
        for (int j:a){
            if((j & right)==0){
                eor1=eor1^j;
            }
        }
        System.out.println(eor1+","+(eor^eor1));
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3,思考

若题目中不告诉你有多少个数出现了奇数次,让你找出所有出现奇数次的数,能否用位运算找出?若可以找出则应该怎么找出?

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

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

相关文章

LCR测试仪的测试原理及使用方法

LCR表是电子测量仪器中经常使用的电子仪器,作为电子仪器的一员,LCR表经常出现在高校实验室和研究所里,但是对于刚接触它的用户来说,可能还不太了解。今天安泰测试就给大家介绍一下LCR表的测试原理和使用方法。 LCR的含义&#xf…

Crack:GrapeCity Documents for Excel 6.0.1

v6 中 GrapeCity Documents for Excel 的新增功能 ocuments for Excel (GcExcel) v6 版本现已上线!该版本引入了新的基于 JavaScript 的数据查看器控件、功能和对 GcExcel .NET和Java API 的模板增强,以及更多与SpreadJS兼容的功能。看看下面的主要亮点。…

第07讲:Redis集群之cluster

一、什么是Cluster? redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储&#x…

pycharm运行显示未安装包,但其实已经安装

问题描述 在下载了专业版的pycharm后,在pycharm终端运行项目的时候,无论什么包,只要你下载,就是显示已经存在(当然存在了,我虚拟环境之前都下的有) REquirement already statisfied:…

【OpenCV-Python】教程:9-1 级联分类器

OpenCV Python 级联分类器 【目标】 Haar 级联目标检测器工作方式;Haar 级联分类器检测人脸和人眼 【理论】 基于Haar特征的级联分类器的目标检测是Paul Viola和Michael Jones在2001年的论文中提出的一种有效的目标检测方法。这是一种基于机器学习的方法&#x…

Swift 周报 第二十期

前言 本期是 Swift 编辑组自主整理周报的第十一期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。 在这个来去匆匆风云变幻的季节&…

工厂设备管理难点与解决方案

工厂设备管理中经常会遇到哪些问题? 设备是生产力的重要组成部分,是工厂从事生产经营的重要工具,生产设备无论从企业资产的占有率,还是从管理工作的内容上都占据相当大的比重,管好、用好设备,提高设备管理…

JS 之 对象、继承

目录 JS对象 1.通过new Object()创建 2.工厂模式 3.构造函数模式 4.原型模式 5.组合使用构造函数与原型对象 6.动态原型模式 7. 寄生构造函数模式 8.稳妥构造函数模式 原型对象 原型链 继承 1.原型链继承 2.借用构造函数(经典继承 | 伪造函数&#xff…

CTF之密码学题目-classical coding

CTF系列文章 第一篇 CTF之密码学题目-classical && coding 文章目录CTF系列文章前言一、题目是什么?二、解题步骤1.下载文件,解压2.解码Unicode3.ASCII码解码4.BrainFunk解码5.莫斯码解码6.字频解密总结前言 在CTF比赛中,有关密码学…

Memtiter-benchmark源码解析2--shared_connection

shard_connection.h class shad_connection private members Line 161 行 bufferevent* m_bev;重要的bufferevent_event important methods setup_event shard_connection.cpp bufferevent_setcb 设置了 m_bev 的读事件的函数回调,没有设置写事件的函…

如何策划一场银行校招线上笔试?

策划一场银行校园招聘线上笔试,只需要4步。 牛客基于服务的上千家企业现状发现,银行业大多数企业在校园招聘的笔试环节会面临这些核心问题: 缺乏出题专业度:大多数企业出题者为业务部门员工,技能水平不一&#xff0c…

Educational Codeforces Round 97 (Rated for Div. 2) D. Minimal Height Tree

Problem - D - Codeforces 翻译: Monocarp有一棵树,它由𝑛个顶点组成,并以顶点1为根。他决定研究BFS(宽度优先搜索),所以他在他的树上运行BFS,从根开始。BFS可以用下面的伪代码描述: A [] #处理顶点的顺序…

欧几里得空间

文章目录1 欧几里得范数2 距离3 标准内积4 柯西-施瓦茨不等式5 正交6 叉乘7 平行四边形法则8 欧几里得运动线性空间里最重要的就是欧几里得空间了,这是线性代数学习绕不过去的槛。欧几里得空间,学习起来我觉得吧,主要是三个点:内积…

Golang面试宝典——Go语言实现排序算法之快速排序

关于Golang面试宝典 最近几年,Go的热度持续飙升,国内外很多大公司都在大规模的使用Go。Google是Go语言诞生的地方,其他公司如Facebook、腾讯、阿里、字节跳动、百度、京东、小米等都在拥抱和转向Go。Go语言的开源项目也非常多,如…

无人驾驶(四)---远程桌面控制工具: NoMachine踩坑记录

NoMachine for mac是一款免费的远程桌面访问工具,这款软件的连接到远程桌面后延迟可以非常低,NX协议在高延迟低带宽的链路上提供了近乎本地速度的响应能力,打破空间和时间的障碍,让您的桌面环游世界。 1.环境配置 服务端&#x…

西门子PLC各类通信协议差异对比

西门子PLC有4大类,几十个型号类型,PLC不同所支持的通讯协议也不相同。 S7-200系列支持的协议有:PPI、MPI、PROFIBUS、以太网、S7协议、AS-INTERFACE、USS、MODBUS、自由口。 S7-300\400系列支持的协议有:MPI、PROFIBUS、ETHERNE…

陌陌综合案例

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等…

【python3】10.python高阶内容:装饰器

10.python高阶内容:装饰器 2022.12.28 装饰器装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。参数可以是函数,返回值也可以是函数。 10.1 形式 def decorator(fn):def wrapper(name):print(name&…

【Linux进程】进程的基本概念,fork的使用,各种状态的含义,孤儿和僵尸进程的含义

目录 1.进程的基本概念 2.描述进程-PCB 3.fork创建子进程 4.各种状态对应的含义及进程大概的运行原理 5.僵尸进程 ​6.孤儿进程 7.进程的优先级 1.进程的基本概念 2.描述进程-PCB PCB概念:进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集…

ChatGPT注册教程

ChatGPT是最近很火的AI智能对话聊天软件。我们是能够去用来进行更加自由的智能内容讨论和聊天。有的小伙伴还不知道怎么注册。 官方地址:chat.openai.com/chat 注册步骤 1、进入官网后,点击注册按钮。 2、点击创建账号。 3、输入自己的邮箱账号。 4、…