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

news2025/1/10 20:20:25

前言

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

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/118426.html

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

相关文章

cadence SPB17.4 - 用元件管理器来更新原理图中的元件属性信息

文章目录cadence SPB17.4 - 用元件管理器来更新原理图中的元件信息概述笔记修正原理图库修正CIS库的元件登记表ENDcadence SPB17.4 - 用元件管理器来更新原理图中的元件信息 概述 画好图后, 出了BOM. 同学指出BOM中有些元件型号信息不合适, 影响元件购买, 想改一下. 更新了原…

设计模式-桥接、职责链、中介

前言 本文为datawhale2022年12月组队学习《大话设计模式》task6打卡学习。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern 一、桥接模式 1.1 基本定义 桥接模式(Bridge Pattern)又称为柄体(Handle and Body)模式或接口(In…

第十二讲:生成树概念及STP技术应用

在传统的交换网络中,设备通过单条链路进行连接,当某一个点或是某一个链路发生故障时可能导致网络无法访问,解决这种问题的办法是在网络中提供冗余链路,但是交换机网络中的冗余链路会产生广播风暴、MAC地址失效等现象,最…

StarRocks 统计信息和 Cost 估算

导读:欢迎来到 StarRocks 源码解析系列文章,我们将为你全方位揭晓 StarRocks 背后的技术原理和实践细节,助你逐步了解这款明星开源数据库产品。本期 StarRocks 技术内幕将主要介绍 StarRocks 统计信息和 Cost 估算。 1.背景 在学习本文之前&…

mysql搭建主从复制

Mysql主从复制搭建过程: 主从需同步时间,主开启ntpd(ntp网络时间协议,它的端口号udp123)服务-----修改配置,从通过/usr/sbin/ntpdate 主ip(ntpdate包需要提前安装);主:开启中继二进…

整数划分问题(Java递归)

整数划分问题(Java递归) 文章目录整数划分问题(Java递归)0、 问题描述1、递归式2、代码3、参考0、 问题描述 整数划分问题 将正整数n表示成一系列正整数之和:nn1n2…nk,其中n1≥n2≥…≥nk≥1,k…

数字校园建设方案技术建议书

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除!完整资料领取见文末,部分资料内容: 1.1 华为数字化…

“设计”小哥转行5G网络优化工程师!从零开始,三个月实现逆风翻盘~

5G网络优化,一个陌生的领域,对于一个毫无经验的小白来说,选择转行必定是需要勇气和决心的。好在,在决定选择5G网络优化的这一段时间里,老师给予了我最大的帮助和支持,包括从授课,到练习&#xf…

【Linux】基础IO(open、文件描述符、缓冲区)

文章目录1、从文件操作开始1.1 文件操作的系统调用接口1.2 文件描述符2、重定向3、缓冲区1、从文件操作开始 在C语言阶段,接触了很多库函数,如fopen、fclose、fread和fwrte,这些函数帮助了程序实现了内存与磁盘的输入输出功能。 不过之前都…

轻松搭建MQTT服务器,开发流程全透明

1、使用场景 MQTT服务器适用场景就不多介绍了,基本上实在IOT圈发光发热,所以说是特定领域的一个服务端软件,我们是用在车联网的环境里,用来发布消息。 2、选型 最早说需要使用mqtt服务器,然后我以为需要自己开发服务…

专利代理机构代理专利流程

代理申请专利流程是怎么样的? (一)咨询 1、 确定发明创造的内容是否属于可以申请专利的内容。 (二)技术交底 1、申请人向专利代理人提供有关发明创造的背景资料或委托检索有关内容; 2、申请人详细介绍发明创造的内容,帮助专利代理人充分理解发明创造…

【windows下nginx反向代理 ip地址和域名(含启动重启和关闭3个脚本)】 1.vue案例必须修改vue.config.js

例子1:代理vue的web服务器 1)去官网下nginx: download 下载windows版本nginx,并写好脚本,总体目录如下: StartNginx.bat // 启动脚本 echo off echo "nginx start !!!" nginx.exe -c conf/nginx.conf pause ReStartNginx.bat // 修改nginx.conf后重启脚…

redis学习笔记(基础)

Redis简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、…

飞腾FT-2000/4处理器+复旦微FPGA+国产操作系统解决方案

XM-1203-FPGA飞腾定制主板 自主可控,国产CPU、BIOS和国产Linux操作系统 性能稳定,FT-2000/4处理器 功能接口多样化,可扩展性强 高度集成,具有丰富的接口和电磁兼容性能. XM-1203-FPGA基于飞腾4 核CPU FT-2000/4的处理器板&#x…

【Javassist】快速入门系列09 当检测到数组创建时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

springboot整合之统一结果返回

特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…

树与二叉树(遍历)

一、树 树结构是一种非常重要的非线性数据结构,该结构中的一个数据元素可以有两个或者两个以上的直接后继元素。 1、树的定义 树是由 n(n>0)个有限结点组成一个具有层次关系的集合,当 n0时称为空树,当 n>0时称为非空树。 对于非空树来…

水上交通AIS常见问题解决方案

水上交通AIS常见问题解决方案 AIS无信号的几种情况 情况一:AIS未开启。 解决方法:开启AIS设备。 情况二:AIS开启但MMSI码和证书不一致。 解决方法:船长向直属海事部门申请MMSI码,并请专业人员将正确的MMSI码写入AIS设…

数据结构之堆的实现以及实现堆排序和建堆解决Top K问题

文章目录前言1.堆的相关介绍1.什么是堆2.堆的结构2.堆的相关接口具体实现1.堆的声明和堆的初始化2.堆插入数据和删除数据3.堆的其他函数接口3.堆的实际运用1.建堆算法2.堆的应用之堆排序3.堆解决Top k问题4.总结前言 之前对树的相关知识概念进行了简单介绍,本文将实…

odps-jdbc提交MaxCompute数据源SQL报错HTTP/1.0 is not allowed

概述 最近负责的一款数据产品。有个功能:选择某个数据源,比如阿里云的MaxCompute数据源,然后手写SQL,点击自动生成字段(即获取前置SQL里的查询字段。前置SQL可以有drop then create table动作子句,但是最后…