转载 -- 按位异或的性质及其妙用

2023-11-01

https://www.jianshu.com/p/86a7cf855e51

 

文章摘要:
1、按位异或,可以简单理解成:不进位加法。即:1+1=0;0+0=0;1+0 =1;
2、任何数和自己异或结果为零。
3、按位异或的自反性。两次运算操作,可以将最后的结果还原。
4、任何数和0做异或值不变,和1异或结果为原操作数取反。
5、交换律。不使用中间变量,交换两个数

// 按位异或自反性。对一个数做两次 异或运算操作,可以将最后的结果还原

let i = 3;
let j = 4;
console.log('i=' + i + ',j=' + j);

// ①
i = i ^ j;
console.log('i= i ^ j  ==> i=' + i + ',j=' + j);

// ②
j = j ^ i;
// 按位异或自反性。对一个数做两次 异或运算操作,可以将最后的结果还原
// 相当于 j = j ^ i = j ^ (i ^ j) = i ^ j ^ j => 还原为 i
console.log('j= j ^ i  ==> i=' + i + ',j=' + j);

// ③
i = i ^ j;
// 相当于 i = i ^ j = (i ^ j(注意,此处的j不要当成i的值,这里把i^i当成一个已经计算出结果的整体)) ^ j(注意,此处的j已经在第②步,已经变为等于最初的i值了)
//                  => (i ^ j) ^ i = i ^ j ^ i
console.log('i= i ^ j  ==> i=' + i + ',j=' + j);

i = 3;
j = 7;
k = i ^ j;
console.log('i + j=>' + k);


// 结果如下
i=3,j=4
i= i ^ j  ==> i=7,j=4
j= j ^ i  ==> i=7,j=3
i= i ^ j  ==> i=4,j=3
i + j=>4

一、按位异或具有自反性。即:对同一个数据,进行两次按位异或操作,等于数据本身。


int displayOptions = 0x1100;
int flag = 0x1001;
int result = displayOptions ^ flag;

System.out.println(Integer.toHexString(displayOptions) 
                + " ^ " + Integer.toHexString(flag)
                + " = " + Integer.toHexString(result));
//第一次运算:1100 ^ 1001 = 0101

result = result ^ flag;
System.out.println(Integer.toHexString(displayOptions) 
                + " ^ " + Integer.toHexString(flag)
                + " = " + Integer.toHexString(result));
// 第二次运算:0101 ^ 1001 = 1100(displayOptions)

//我们还可以直接使用如下的代码直接进行测试:
System.out.println(Integer.toHexString(displayOptions ^ flag ^ flag));

二、应用案例

场景:
大房子中有很多关闭的电灯,随机操作电灯开关,实时显示房间中电灯的状态,并允许一键关闭所有电灯。【只允许使用按位异或】

分析:
1、连续两次操作电灯开关,电灯将处于操作前状态。
2、关闭所有开关。任何数和自己异或结果为零。

实现:
1、定义“大房子”类。
lightFlags 标识房间全部电灯实时状态。
封装电灯操作方法以及一键关闭所有电灯的方法。

/**
 * 1、按位运算操作应用。
 * 2、走廊灯、厕所灯、厨房灯、主卧灯、次卧灯分别对应一个字段位
 * 走廊灯=0000 0001
 * 厕所灯=0000 0010
 * 厨房灯=0000 0100
 * 主卧灯=0000 1000
 * 次卧灯=0001 0000
 * @author DrodYoung
 */
static class 大房子{
 private static final int 走廊灯 = (1 << 0); // 1{0000 0001}
 private static final int 厕所灯 = (1 << 1); // 2{0000 0001}
 private static final int 厨房灯 = (1 << 2); // 4{0000 0001}
 private static final int 主卧灯 = (1 << 3); // 8{0000 0001}
 private static final int 次卧灯 = (1 << 4); //16{0000 0001}
 
 private static final int LIGHT_MASK = 走廊灯|
     厕所灯|
     厨房灯|
     主卧灯|
     次卧灯;
 //lightFlags = 电灯状态标记字段。
 private int lightFlags = 0;
 
 private void 操作电灯开关(int flag){
   lightFlags ^= flag;
 }
 //任何数和自己异或结果为零。
 private void 让所有的灯关闭(){
 操作电灯开关(lightFlags);
 }

 @Override
 public String toString() {
 return "房子中电灯状况:\n"
 +"走廊灯="+(((lightFlags&走廊灯)!=0)?"开":"关")+"\n"
 +"厕所灯="+(((lightFlags&厕所灯)!=0)?"开":"关")+"\n"
 +"厨房灯="+(((lightFlags&厨房灯)!=0)?"开":"关")+"\n"
 +"主卧灯="+(((lightFlags&主卧灯)!=0)?"开":"关")+"\n"
 +"次卧灯="+(((lightFlags&次卧灯)!=0)?"开":"关")+"\n";
 }
 
}

2、测试:

//1、初始化大房子对象
大房子 hourse = new 大房子();
System.out.println(hourse);

//2、操作厨房灯开关
hourse.操作电灯开关(大房子.厨房灯);
System.out.println(hourse);//厨房灯为【开】

//3、再次操作厨房灯开关
hourse.操作电灯开关(大房子.厨房灯);
System.out.println(hourse);//厨房灯为【关】

//4、依次操作主卧灯、次卧灯、走廊灯开关
hourse.操作电灯开关(大房子.主卧灯);
hourse.操作电灯开关(大房子.次卧灯);
hourse.操作电灯开关(大房子.走廊灯);
//5、一键关闭所有灯
hourse.让所有的灯关闭();
System.out.println(hourse);

三、总结:

妙用按位异或,可以让代码更加简洁、高效。本例演示了按位异或的自反性,异或还有其他妙用,我们可以总结如下:

  • 1、按位异或,可以简单理解成:不进位加法。即:1+1=0;0+0=0;1+0 =1;
  • 2、任何数和自己异或结果为零。
  • 3、任何数和0做异或值不变,和1异或结果为原操作数取反。
  • 4、交换律。不使用中间变量,交换两个数。
a=a^b;  
b=a^b;  
a=a^b; 



作者:Android那些事儿
链接:https://www.jianshu.com/p/86a7cf855e51
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转载 -- 按位异或的性质及其妙用 的相关文章

  • Cookie 和 Session 归纳

    首先介绍下基本概念 cookie是服务器通知客户端让其保存健值对的一种形式 客户端有了cookie之后 每次请求就会发送给服务器 每个cookie最大是4kb 服务器创建cookie 1Cookie cookie new Cookie 创建
  • 计算机基础汇总

    计算机基础汇总 时间复杂度 https blog csdn net qq 41523096 article details 82142747 数组与链表 https blog csdn net qq 25806863 article det
  • 删除卷与分页文件(虚拟内存文件)

    无法删除卷可能是由于这个磁盘中存在分页文件 虚拟内存文件 引起的
  • win10如何校验文件哈希值

    转自 https jingyan baidu com article 67662997a9b06654d51b84a1 html 文件的哈希值可以用软件计算 算法一样 无须多讲 本文讲述如何用win10自带命令计算 右击开始 点击windo
  • 补码的除法运算

    补码的除法运算是将两个数都使用补码的形式来进行计算 和原码的除法相比 补码的除法运算中被除数 除数以及余数都采用双符号位的形式参与计算 最后得到的余数符号位就代表着最终结果的符号位 加减交替法 题目 假设机器字长为5位 x 0 1000 y
  • 在浏览器地址栏键入URL按下回车之后会经历什么?

    在浏览器地址栏键入URL按下回车之后主要会经历以下7个步骤 1 查找浏览器缓存 如果查找到缓存中有我们URL对应的文件 则判断是否命中强缓存 如果命中直接读取使用即可 如果强缓存没有命中 判断协商缓存是否命中 但协商缓存不论是否命中都会发送
  • 计算机网络-详细版

    鉴于有人需要离线版的PDF文档 这里给出本文章的PDF版本 下载地址如下 https pan itnxd cn 123Pan csdn share computer network pdf 一 计算机网络体系结构 0 脑图 1 计算机网络概
  • [Git & GitHub] Windows下安装git,从0开始搭建git环境(配置环境变量+设置git-ssh key...配置)(超全版)

    目录 前提准备 安装Git Git配置 配置环境变量 git配置 ssh认证配置过程 配置邮箱和用户名 个人身份 文本换行符配置 前提准备 下载地址 点击此处 点击Windows进行下载 若下载比较慢 点击此处 安装Git 下载之后 双击G
  • LRU 最近最少使用算法

    LRU 最近最少使用算法 设计LRU Cash 数据结构 设计方法 代码实现 总结 百度百科 LRU是Least Recently Used的缩写 即最近最少使用 是一种常用的页面置换算法 选择最近最久未使用的页面予以淘汰 该算法赋予每个页
  • 如何用地址栏查看网页的源代码

    如何在地址栏里输入命令查看目标网页的源代码 输入 view source http www baidu com 当然这只是一个例子 view source 后面 跟完整的url地址
  • Linux系统启动分析

    文章目录 大体流程分析 一 BIOS 1 1 BIOS简介 1 2 POST 二 BootLoader GRUB 2 1 What s MBR 2 2 What s GRUB 2 3 boot img 2 4 core img lzma d
  • Linux操作系统与Shell编程

    Linux是自由 开源的操作系统 安装在计算机的硬件之上 是用来操作计算机硬件和软件资源的系统软件 一般应用于专业的web服务器上 具有以下特性 Linux注重系统的安全性 对文件访问权限有严格设定 最高权限账户为root用户 可以操作一切
  • Matlab2021a安装教程

    目录 一 资源文件 二 安装 一 资源文件 名称 Matlab R2021a 大小 17 11GB 语言 简体中文 安装环境 Win10 64位下载链接 https pan baidu com s 1OIyhX8kpVfydlo aOnbT
  • 计算机编程语言:解释型语言与编译型语言的理解

    一 计算机编程语言 主要分为3类 高级语言 抽象层次更高的便于记忆和表示的英文代码 汇编语言 抽象层次较高的对应机器硬件的cpu指令集 英文缩的助记 符号代码 机器语言 抽像层次最低的由0 1序列所表示的机器码 计算机底层只能识别0 1 所
  • 计算机基础内容——网络基础

    网络基础 设备是如何上网的 网卡 有线 无线 内置天线 网线接口RJ45 usb转RJ45 交换机 路由器 外置天线 天线棒 光猫 宽带运营商 不同的宽带运营商之间是互通的 路由器发出的wifi信号 2 4GHz wifi 5 0GHz w
  • 字符编码和字符集有什么区别?Unicode是什么,和UTF-8是什么关系?你想知道的都在这篇文章了

    前言 想必大家编写代码时肯定和我一样 也遇到过汉字乱码的问题 特别是 有时候和上下游对接接口 不能统一编码格式的话 一堆乱码问题 让人头皮发麻 那么为什么会有这么多的乱码问题 什么是字符编码 什么是字符集 他们之间有什么区别和联系 什么是
  • 服务端推送SSE技术

    SSE Server Sent Events 是一种用于实现服务器主动向客户端推送数据的技术 也被称为 事件流 Event Stream 它基于 HTTP 协议 利用了其长连接特性 在客户端与服务器之间建立一条持久化连接 并通过这条连接实现
  • 图解Git

    基本用法 上面的四条命令在工作目录 暂存目录 也叫做索引 和仓库之间复制文件 git add files 把当前文件放入暂存区域 git commit 给暂存区域生成快照并提交 git reset files 用来撤销最后一次git add
  • 通过wireshark抓取telnet登陆密码

    笔者学校有一台设备 ip地址是 192 168 84 10 先打开wireshark捕获无线网卡 使用telnet登陆如图所示 按下回车 笔者这里输入的密码是 A603 现在回到wireshark停止抓包 并且在filter处输入如下的过滤
  • FLOPS、TOPS和FLOPs的区别

    FLOPS 即每秒浮点运算次数 是每秒所执行的浮点运算次数 Floating point operations per second 缩写 FLOPS 的简称 被用来评估电脑效能 FLOPs 注意s小写 是floating point op

随机推荐

  • mac如何卸载python2.7_mac python环境的安装与卸载

    换电脑之前并没有了解很多mac 所以习惯性的安装软件都是官网或者appstore下载来安装的 so 我下载了python2 7 并安装了 后来学习的视频是3 6的版本 又下载的3 6的版本来安装 过程中知道自带python2 7版本 也看到
  • 踩坑系列—mybatis查询没有数据时返回的list是null还是空集合?

    场景 根据多个条件查询 返回list集合数据 代码 第1步 根据页面多个条件查询 List list userDao queryOrders queryParams if null list return null 第2步 有数据再追加其他
  • Photoshop 通道讲解

    我常常问我的学生 什么是Photoshop最重要 不可或缺的功能 很多人的回答是图层 Layer 其实在Photoshop3 0之前根本没有图层的功能 在Photoshop的领域中 最重要的功能是选取范围 正确的运用选取范围 才能够做出精准
  • 从CSV文件导入Hive出现中文乱码问题解决

    关于HIVE中文乱码问题的解决办法 网上有很多帖子 然而很多都是基于LINUX终端显示字符的修改 其实上对于一些条件下的HIVE中文乱码问题是无法解决的 如从CSV文件导入到HIVE中出现的中文乱码问题 大家都知道 HIVE原生的字符编码是
  • 区块链密码学之对称加密

    前言 对称加密 顾名思义就是公钥和私钥都是同一个 只有一把密钥 那么密钥的共享就需要特别注意 容易泄露 但是由于它的加密效率高 速度快 占用空间小 主要用在大量数据的加密 往往需要提前分发密钥 对称密码从实现上可以分为两种 分组密码和序列密
  • 查询Windows默认编码格式

    开始 gt cmd gt chcp 然后显示一个数字 如936 则代表是GBK简体中文
  • unity生成透明背景的截图,截图背景图透明,UGUI scrollview滑动的时候不能遮罩3d模型

    转载 Unity3D Unity3D 摄像机带透明截图 静茹 鱼 博客园 using System using UnityEngine using System IO public class CropPicture MonoBehavio
  • Sonarqube安装插件报错An error has occurred. Please contact your administrator

    报错信息 Sonarqube安装插件时提示 An error has occurred Please contact your administrator 解决方法 1 查询报错日志 使用docker logs查询Sonarqube日志 插
  • jpress代码审计分享

    声明 出品 先知社区 ID 1871162774168111 以下内容 来自先知社区的1871162774168111作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作
  • 【转载】一些比较好的电子资源网站

    SkyEye Project SkyEye是一个开源软件 opensource software 项目 中文名字是 天目 SkyEye的目标是在通用的Linux和Windows平台实现一个模拟集成开发环境 模拟基于ARM的嵌入式计算机系统
  • 《Linux C++》线程池

    为什么使用线程池 线程池的出现正是着眼于减少线程本身带来的开销 避免 即时创建 即时销毁 线程池应用场合 像大多数网络服务器 包括Web服务器 Email服务器以及数据库服务器处理数目巨大的连接请求 但处理时间却相对较短 并且实时性要求比较
  • 硬见小百科」这些PCB布局布线规则,你了解多少?

    元器件布局的10条规则 遵照 先大后小 先难后易 的布置原则 即重要的单元电路 核心元器件应当优先布局 布局中应参考原理框图 根据单板的主信号流向规律安排主要元器件 元器件的排列要便于调试和维修 亦即小元件周围不能放置大元件 需调试的元 器
  • Java中的sort()

    sort的第一种格式 sort的第二种格式 sort函数中cmp函数的使用方法 自定义排序基本方法 sort的第一种格式 sort函数的基本格式 默认排序为升序排序 Arrays sort 数组名 起始下标 终止下标 例 import ja
  • 【机器学习】机器学习建模调参方法总结

    文章目录 一 前言 1 1 数据来源 1 2 理论简介 二 知识总结 2 1 回归分析 2 2 长尾分布 2 3 欠拟合与过拟合 2 4 正则化 2 5 调参方法 2 5 1 贪心调参 坐标下降 2 5 2 网格调参GridSearchCV
  • JavaScript高手进阶:详解Eval加密

    在JavaScript编程中 涉及到代码加密 在混淆加密时代之前 用的最多的应该是种Eval加密 加密后的特征是以 eval function p a c k e r 为代码开始 相信很多人都见过这种代码 Eval加密效果例程 这是一种非常
  • MFC 解决中文乱码问题

    新的编译工具默认的是unicode编码方式 许多在多字节下面显示中文的方法已经不再适用了按照道理说设置为unicode编码后应该会很好的支持中文 但是实际情况很悲惨 显示的都是乱码 看到网上的很多方法都是把CSTRING转来转去 很头疼 感
  • powershell 删除指定文件夹及文件

    删除指定的文件夹 Get ChildItem C ccccc Recurse Where Object PsIsContainer Where Object FullName like test Remove Item Force Recu
  • SpringBoot配置多数据源

    项目框架 SpringBoot MyBatis Mysql 项目连接两个数据库源 1 application yml配置 使用DruidDataSource 主数据库为primary 副数据库为secondary 名称可以自己定义 只要和后
  • 如何使用Git进行版本控制

    在软件开发过程中 版本控制是一个非常重要的部分 它可以让开发人员更轻松地管理代码 集成代码 以及跟踪代码的变更历史 Git是一个广泛使用的版本控制工具 它的易用性和可扩展性使得它成为了开源社区的首选 在本文中 我们将介绍如何使用Git进行版
  • 转载 -- 按位异或的性质及其妙用

    https www jianshu com p 86a7cf855e51 文章摘要 1 按位异或 可以简单理解成 不进位加法 即 1 1 0 0 0 0 1 0 1 2 任何数和自己异或结果为零 3 按位异或的自反性 两次运算操作 可以将最