【转存】异或运算的妙用

news2024/9/19 17:09:41

概述

异或运算 通过对两个相同长度的二进制数进行逐位比较,若对应位的值不同,结果为 1, 否则结果为 0, Go 语言中使用的运算符号为 ^

下面举几个简单的小例子:

0 ^ 0 = 0

0 ^ 1 = 1

1 ^ 0 = 1

1 ^ 1 = 0

图片

图片来源: https://www.build-electronic-circuits.com/xor-gate/

运算定律

交换律

x ^ y = y ^ x

结合律

x ^ (y ^ z) = (x ^ y) ^ z

任何数与自身进行异或运算,结果都为 0

x ^ x = 0

任何数与 0 进行异或运算, 结果为其自身

x ^ 0 = x

有了上面的理论基础之后,下面来看下异或运算的几个应用。


交换两个变量的值

有个经典的笔试题:交换两个变量的值,不能使用第三个变量。

解法一

利用 Go 语言的原生 “骚操作” :

package main

import "fmt"

func main() {
 x, y := 1, 2
 
 x, y = y, x

 fmt.Printf("x = %d, y = %d\n", x, y) 
 // 输出: x = 2, y = 1
}

当然了,如果在真实面试中这样写,只能回去等消息了。

解法二

利用加法分配率

package main

import "fmt"

func main() {
 x, y := 1, 2

 x += y    // x = 3
 y = x - y // y = 1
 x -= y    // x = 2

 fmt.Printf("x = %d, y = %d\n", x, y)
 // 输出: x = 2, y = 1
}

解法三

异或运算性质: 三个值中的任意两个值进行异或运算,都可以得出第三个值。

package main

import "fmt"

func main() {
 x, y := 1, 2

 x ^= y    // x = 3
 y = x ^ y // y = 1
 x ^= y    // x = 2

 fmt.Printf("x = %d, y = %d\n", x, y)
 // 输出: x = 2, y = 1
}

加密解密

异或运算可以实现简单高效的加密解密,例如:

  • 明文数据为 text

  • 密钥为 secret

  • 密文数据为 token

# 服务端响应时,返回加密数据

token = text ^ secret

# 服务端接收到请求时,解密数据

text = token ^ secret

这个经典应用在 CSRF 攻击防范 一文中已经讲过,这里不再赘述,感兴趣的读者可以跳转阅读。

数据备份

将数据 x 和数据 y 进行异或运算得到备份数据 z, 然后将三个数据同时保存 (备份数据 z 保存到可用性更高的数据中心),之后不论数据 x 或数据 y 损坏了,都可以根据备份数据 z 进行恢复。

简化计算

在多个值进行计算的场景中,可以根据运算定律简化计算过程:

x ^ y ^ z ^ x ^ y

上述计算式子根据交换律,可以得到:

x ^ x ^ y ^ y ^ z

根据 “任何数与自身进行异或运算,结果都为 0” 运算定律,可以得到:

0 ^ 0 ^ z = z

算法设计

异或运算经常被用于设计高效的数据结构和算法,例如之前的文章提到的 布谷鸟过滤器。

LeetCode 原题

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

要求: 必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

# 示例 1
输入:nums = [2,2,1]
输出:1

# 示例 2
输入:nums = [4,1,2,1,2]
输出:4

# 示例 3
输入:nums = [1]
输出:1

解题代码如下:

// 利用异或运算的性质:
// 1. 任何数和 0 做异或运算,结果仍然是原来的数
// 2. 任何数和其自身做异或运算,结果是 0
// 3. 异或运算满足交换律和结合律,a^b^a = b^a^a = b^(a^a) = b^0 = b
func singleNumber(nums []int) int {
 res := 0
 for _, v := range nums {
  res ^= v
 }
 return res
}

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

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

相关文章

Jpg格式如何转成gif格式动图?简单一招搞定gif制作

平时我们看到的使用的gif动图一般是由静态图片合成或是从视频中截取这两种方法制作的。当我们想要将一段视频制作成gif动画却不知从何下手的时候应该怎么办呢?这时候,只需要使用一个在线gif动态图片制作(https://www.gif.cn/)网站…

时间范围配置(昨天,今天,本周,本月,本季度,本年)

ranges:{ ‘昨天’: [ moment(moment().subtract(1, ‘days’).format(‘YYYY-MM-DD 00:00:00’)) ,moment(moment().subtract(1, ‘days’).format(‘YYYY-MM-DD 23:59:59’))], ‘今天’: [ moment(moment().format(‘YYYY-MM-DD 00:00:00’)),moment( moment().format(‘YYY…

Colab matplotlib画图如何显示中文字体【图例坐标轴均可显示中文】

Colab notebook用matplotlib画图中文出现方块: 如何解决这个问题呢? 运行wget -O simhei.ttf "https://www.wfonts.com/download/data/2014/06/01/simhei/chinese.simhei.ttf",安装中文字体,这里装得是SimHei&#xf…

pdf文件过大如何减小?快来试试这个方法

在传送pdf文档的时候,如果内容太多,就会导致文件过大不方法发送,所以需要先把pdf压缩(pdf压缩 PDF文件压缩 pdf在线压缩工具-压缩图)一下,但是下载安装又耽误时间,这里推荐使用pdf在线压缩的方法…

vite vue3 pwa 更新提醒

效果 vite-plugin-pwa插件启用pwa后默认会在后台自动更新应用,并在关闭所有已开启的页面并重新打开后激活 通过此方法可以以消息方式提醒用户手动刷新激活更新应用 方法 已经使用vite-plugin-pwa插件启用pwa 修改vite.config.ts export default defineConfig(…

缓存的力量:提升API性能和可扩展性

缓存是将频繁访问的数据或资源存储在临时存储位置(例如内存或磁盘)的过程,以提高检索速度并减少重复处理的需要。 缓存的好处 提高性能:缓存消除了每次从原始源检索数据的需要,从而提高了响应时间并减少了延迟。减少服务器负载:通…

Maven系列第4篇:仓库详解

maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第4篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 环境 maven3.6.1 …

Wifi列表扫描和Wifi链接

上面的截图&#xff0c;就是本文要介绍的主要功能。 1.准备工作&#xff0c;声明权限&#xff1a; <uses-permission android:name"android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name"android.permission.ACCESS_WIFI_STATE&quo…

振弦传感器和振弦采集仪应用隧道安全监测的解决方案

振弦传感器和振弦采集仪应用隧道安全监测的解决方案 现代隧道越来越复杂&#xff0c;对于隧道安全的监测也变得越来越重要。振弦传感器和振弦采集仪已经成为了一种广泛应用的技术&#xff0c;用于隧道结构的监测和评估。它们可以提供更精确的测量结果&#xff0c;并且可以在实…

三维模型3DTile格式轻量化压缩集群处理方法分析

三维模型3DTile格式轻量化压缩集群处理方法分析 在地理信息系统中&#xff0c;由于三维模型的数据密度和文件体积较大&#xff0c;因此需要进行轻量化和压缩处理。这里我们将对使用集群处理方法来实现3D Tiles数据的轻量化压缩进行探讨。 首先&#xff0c;集群计算是一种并行处…

WebDAV之π-Disk派盘 + 开源阅读

开源阅读是一款真正免费的小说阅读软件。开源阅读app有多种新颖的书籍资源。用户可以自由设置并添加书籍清单。无论是在线搜索和浏览还是本地TXT文件导入,都非常方便。当用户使用开源阅读应用阅读小说时,不会有广告跳出来,您可以阅读整个过程,开源阅读app是喜欢看小说的朋友…

持续集成交付CICD:Jenkins部署

目录 一、理论 1.CI/CD 2.Gitlab内置持续集成 3.Jenkins安装与部署 4.Gitlab服务部署 5.Jenkins服务部署 6.Tomcat服务部署 7.Jenkins–Pipeline流水线项目构建 二、实验 1.Gitlab服务部署 2.Jenkins服务部署 3.Tomcat服务部署 4.Jenkins–Pipeline流水线项目构建…

RabbitMQ常见的交换机类型

RabbitMQ安装 pom.xml里导入相关的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> application.properties配置文件 spring.rabbitmq.hos…

利用SoapUI工具生成Java WebService客户端代码

一. 下载安装软件 安装SoapUI 5.4.0-EB&#xff1b;下载axis-1_4&#xff0c;下载后解压至个人目录下即可。 注&#xff1a;axis-1_4下载地址&#xff08;https://archive.apache.org/dist/ws/axis/1_4/axis-bin-1_4.zip&#xff09; 二. 创建SOAP Project 点击File–>New…

GRU的 电影评论情感分析 - python 深度学习 情感分类 计算机竞赛

1 前言 &#x1f525;学长分享优质竞赛项目&#xff0c;今天要分享的是 &#x1f6a9; GRU的 电影评论情感分析 - python 深度学习 情感分类 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这…

YOLOv7改进:原创独家首发 | 可变形自注意力Attention | 即插即用系列

💡💡💡本文属于原创独家改进:当你停留在可形变卷积上(DCNV1,DCNV2,DCNV3等),可形变Attention助力检测,创新性十足,不仅增强了 sparse attention 的表征能⼒,同时具有线性空间复杂度。 可形变与attention 的完美融合 | 亲测在多个数据集实现暴力涨点,对遮挡…

数据库Mysql三大引擎(InnoDB、MyISAM、 Memory)与逻辑架构

MySQL数据库及其分支版本主要的存储引擎有InnoDB、MyISAM、 Memory等。简单地理解&#xff0c;存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特色&#xff0c;使用的是一个可插拔存储引擎架构&#xff0c;能够在运行的时候动态加载或者卸载这些存…

为什么说CDN是网站速度优化大师

CDN&#xff08;内容分发网络&#xff09;是一个强大的工具&#xff0c;可以帮助您的网站实现飞一般的加载速度。本文将引领您深入了解CDN的奇妙世界&#xff0c;揭示其强大功能&#xff0c;并提供关于如何充分利用CDN服务来提升网站性能的宝贵建议。 探索CDN的世界 CDN&#x…

功率半导体器件静态参数测试都测哪些内容?

功率半导体器件如今已成为不可或缺的元件&#xff0c;在通信、电力电子等领域得到广泛应用。而对其性能参数的测试也是必不可少的&#xff0c;是对半导体性能、质量的保障。半导体测试参数包含静态测试参数和动态测试参数&#xff0c;本文将介绍半导体分立器件静态测试参数的相…

随手拍文明城市美丽乡村监督上报小程序开发

功能介绍&#xff1a; 一款拍照上传系统&#xff0c;ThinkPHP Uniapp开发&#xff0c;代码简洁&#xff0c;UI清爽。 后台功能 1、应用配置&#xff1a;首页轮播图配置&#xff1b;上报事件标签&#xff1b;上报等级&#xff08;可设置积分&#xff09;&#xff1b;小程序配…