java 实现 按位异或_Java 按位异或的性质及其妙用
文章摘要:
1、按位异或,可以简单理解成:不进位加法。即:1+1=0;0+0=0;1+0 =1;
2、任何数和自己异或结果为零。
3、按位异或自反性。两次运算操作,可以将最后的结果还原。
4、任何数和0做异或值不变,和1异或结果为原操作数取反。
5、交换律。不使用中间变量,交换两个数。
一、按位异或具有自反性。即:对同一个数据,进行两次按位异或操作,等于数据本身。
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;
java 实现 按位异或_Java 按位异或的性质及其妙用相关推荐
- java string hash变量_java基础(六)-----String性质深入解析
本文将讲解String的几个性质. 一.String的不可变性 对于初学者来说,很容易误认为String对象是可以改变的,特别是+链接时,对象似乎真的改变了.然而,String对象一经创建就不可以修改 ...
- 关于Java位运算里的“按位异或”
1.按位异或 是位运算,对二进制位进行运算,0 0 为0,1 1 为0即两个相同的值按位异或为0,0和任何值异或都为其任何值.例如: 1011 0110与0110 0010异或 1011 0110 0 ...
- 位运算符Java与详解_java位运算符详解
java位运算符详讲 一.位运算符分类 java中位运算符主要有:按位与&.按位或|.按位非~.按位异或^. 在使用时,需要将运算数都转换为二进制再进行运算,若为负数则使用补码表示.二. ...
- java double 位运算_JAVA位运算等运算符总结
JAVA位运算等运算符总结 一.概述 运算符是一种"功能"符号,用以通知 Java 进行相关的运算. Java 语言中常用的运算符可分为如下几种:算术运算符 赋值运算符 比较运算符 ...
- java语言基本语法_Java语言基本语法
Java语言基本语法 一.标识符和关键字 标识符 在java语言中,用来标志类名.对象名.变量名.方法名.类型名.数组名.包名的有效字符序列,称为"标识符": 标识符由字母.数字. ...
- java里面的 |运算符_Java 中 | ^ 运算符的简单使用
背景 今天碰到了代码中的按位与运算,复习一下,先列一个各个进制数据表. 顺便复习一下十进制转二进制的计算方式: 接下来解释下这三个运算符: & 按位与,都转为二进制的情况下,同为1则为1,否则 ...
- java乘方运算符号_Java 4. 运算符号
java运算符 运算符 用来指明对于操作数的运算方式 按照操作数的数目来进行分类 单目 双目 三目 a++ a+b (a>b)?x:y; 按照运算符的功能来进行分类 算术运算符 [+ - * / ...
- java的密文发送_Java密文加密方式(一)AES
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对称加密算法也就是加密和解密用相同的密钥,具体的加密流 ...
- java里%是什么_java里.是什么意思?
展开全部 < 数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方. 计算:3 << 2 3 << 2,则是将 ...
最新文章
- android 运动管理,使用 MotionLayout 管理运动和微件动画
- 下边框_OPPO Find X2颜值有多高?超窄下边框+瀑布屏,看完大写的服气
- 蓝桥杯-算法训练 2的次幂表示
- Oracle存储过程 使用游标、数组的配合查询
- 四维偏序 CDQ套CDQ
- 分屏 取消_记录Android7.0以上手机开启分屏后活动的生命周期变化
- Oracle并行事务回滚相关参数及视图
- Win10电脑定时关机无效怎么办
- scanf(%d,%d,a,b)在c语言所代表的含义,在C语言中,有语句“inta,b;scanf(a=%db=%d,a,b);”,下.._简答题试题答案...
- linux下qt网络编程 qnetworkreply,QT网络编程之文件下载 QNetworkRequest QNetworkReply QNetworkAccessManager...
- java 考试,java程序员认证考试试题
- Charles抓包工具简单教程
- 热式气体质量流量计检定规程_新品发布:西尼尔ST51/54热式质量流量计
- 读卡器 linux 驱动,基于Linux的公交一卡通读卡器驱动设计
- 安卓Tv端App开发与手机端的开发的区别
- html5表格数据加载,bootstrap table load加载数据到表格的方法
- 小爱同学指令大全_小爱同学指令
- 浮点型数据存储方式浅析
- 上线不到两个月,昇腾AI助推“中国算力网”再添新节点
- 实用的单片机接反电路,再也不怕电源接反了
热门文章
- 数据分析 - 6.漏斗分析法(学习笔记)
- 批量调取接口_批量请求接口-API文档-开发指南-Web服务 API | 高德地图API
- “观察和思考”给我的启发
- ChaiStore:涨姿势!这些空气币诈骗套路,你能识破吗?
- GC原理介绍、排查FGC及线上故障的步骤
- 技术干货|昇思MindSpore Lite1.5 特性发布,带来全新端侧AI体验
- vue获取登录设备,和浏览器
- Vulnhub靶机:GEARS OF WAR_ EP#1
- 你的应用如何进入VR市场
- for循环和增强版的for循环