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

今天我们研究一段代码(异或位运算)

let a = 18 // 甲
let b = 20 // 乙a = a ^ b 
b = a ^ b 
a = a ^ b console.log("a=",a) // a = 20
console.log("b=",b) // b = 18

今天我们就研究上面这一段代码,简单解释一下,初始化一个a = 18 b = 20, 中间经过了三次的异或之后,a 和 b的值就完成了交换,中间的原因我们今天研究一下

首先异或是一种位运算,元算规则可以简单的理解为,相同为0,不同为1 所以也可以简单的理解为不进位的二进制运算

console.log(0 ^ 1) // 1
console.log(0 ^ 0) // 0
console.log(1 ^ 1) // 0 
console.log(1 ^ 0) // 1
console.log(1 ^ 0 ^ 0) // 1

上面的规律我们可以简单的总结一下:

  • 规则1: 0 异或任何值 都是非0本身
  • 规则2: 任意相同的两个值进行异或,均为0
  • 规则3: 异或的两个值不会随着位置变化而对结果产品变化 所以他满足交换律和结合律

这个时候我们重新看开始的那段代码可以理解为下面的解释

// 假设 a = 甲 b = 乙
a = a ^ b // a = 甲 ^ 乙  b = 乙
b = a ^ b // b = 甲 ^ 乙 ^ 乙  b = 甲
a = a ^ b // a = 甲 ^ 乙 ^ 甲  a = 乙
// 最后 a = 乙 b = 甲 自然得到了 a = 20 b = 18

当然上面的数据需要满足一个前提条件,异或属于位运算,所以参与运算的数据必须是不同位置的才可以,计算机中不同的位置对应的就是不同的内存地址,相同地址就没有位元算的意义了。但是因为js定义变量都是独立的内存位置,所以js中基本上不存在这种公用一个位置的变量,但是c和java这种就不一定了,所以用来交换的时候慎用!!!

给枯燥无味的业务代码添加一点乐趣

http://www.lryc.cn/news/465528.html

相关文章:

  • pycharm中使用ctrl+鼠标滚轮改变字体大小
  • 【算法-动态规划】打家劫舍专题
  • 关于技术管理者的一些思考
  • Alpha-CLIP: A CLIP Model Focusing on Wherever You Want CVPR 2024
  • Golang | Leetcode Golang题解之第495题提莫攻击
  • 04 go语言(golang) - 变量和赋值过程
  • 语言/图像/视频模型一网打尽!BigModel大模型开放平台助力开发者轻松打造AI新应用!
  • Go语言Linux环境搭建以编写第一个Go程序
  • 使用 Go 构建一个最小的 API 应用
  • MySQL 日常维护指南:常见任务、频率及问题解决
  • oracle ORA-24920:列大小对于客户机过大
  • 使用 Docker compose 部署 Nacos(达梦数据库)
  • 人工智能 | 阿里通义千问大模型
  • Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题
  • java防止表单重复提交的注解@RepeatSubmit
  • HTTP快速入门
  • Nacos简介
  • 基于深度学习的稳健的模型推理与不确定性建模
  • C语言 sizeof 的介绍,以及sizeof计算数组名、 数组首地址、数组的元素之间的区别
  • 深入理解Oracle闪回技术
  • Go 语言初探
  • 使用ROS资源编排一键部署LNMP建站环境,手动整理教程
  • 猎板PCB镍钯金工艺你了解多少?
  • 热更新解决方案2 —— Lua语法相关知识点
  • 【c++ arx选项板】
  • 新时代下吉林省城乡流动人才就业问题及路径探析
  • Go 1.19.4 命令调用、日志、包管理、反射-Day 17
  • Unity 2d UI 实时跟随场景3d物体
  • 全方面熟悉Maven项目管理工具(二)坐标、pom.xml文件的解读!
  • php常用设计模式之单例模式