java 实现 按位异或_Java 按位异或的性质及其妙用

java 实现 按位异或_Java 按位异或的性质及其妙用文章摘要:1、按位异或,可以简单理解成:不进位加法。即:1+1=0;0+0=0;1+0=1;2、任何数和自己异或结果为零。3、按位异或自反性。两次运算操作,可以将最后的结果还原。4、任何数和0做异或值不变,和1异或结果为原操作数取反。5、交换律。不使用中间变量,交换两个数。一、按位异或具有自反性。即:对同一个数据,进行两次按位异或操作,等于数据本身。intdisplayOptions=0x…

大家好,又见面了,我是你们的朋友全栈君。

文章摘要:

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;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134901.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 关于jmeter客户端实现中HttpClient4与Java的区别

    关于jmeter客户端实现中HttpClient4与Java的区别如上图:jmeter客户端实现方式有三种,一种是java,一种是httpclient4,还有一种默认,我们来看一下java与httpclient4的区别:Java:选择压测时,链接是复用的(代码中的http调用都加了连接池)httpclient4:压测时,每请求一次都创建一个新的链接,(jmeter5.0以前默认关闭了连接复用,5.0上是打开的:即每请求一次都会创建一个新的链接)从JMeter5.0开始,当使用默认的HC4实现时,JMeter将在每个线程组迭代时重置HTTP状态(SS…

  • 改变QLabel背景颜色

    改变QLabel背景颜色在桌面应用程序开发时,需要显示一些状态信息,例如客户端是否掉线,串口是否打开等,我们可以用一些标志显示给用户,例如如果QLabel显示绿色,表示连接成功,显示黑色表示失败。代码如下:ui.label_Status-&gt;clear(); QPalettepalette; palette.setColor(QPalette::Background,Q…

  • STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)

    STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)一、SDIO简介SD卡(SecureDigitalMemoryCard)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另外一种就是SDIO接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SDI/O卡都有SDIO接口。MMC卡可以说是SD卡的前身,现阶段已经用得很少。STM32F10x系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SDI/O卡以及CE-A

  • Java开发手册之模块命名「建议收藏」

    Java开发手册之模块命名「建议收藏」Java开发手册之模块命名

  • 百度搜索引擎工作原理「建议收藏」

    百度搜索引擎工作原理「建议收藏」  关于百度以及其它搜索引擎的工作原理,其实大家已经讨论过很多,但随着科技的进步、互联网业的发展,各家搜索引擎都发生着巨大的变化,并且这些变化都是飞快的。我们设计这个章节的目的,除了从官方的角度发出一些声音、纠正一些之前的误读外,还希望通过不断更新内容,与百度搜索引擎发展保持同步,给各位站长带来最新的、与百度高相关的信息。本章主要内容分为四个章节,分别为:抓取建库;检索排序;外部投票;结果展现。…

  • 在网页文档中引入Vue.js的方法有哪些?_vue直接引入js文件没有用

    在网页文档中引入Vue.js的方法有哪些?_vue直接引入js文件没有用创建script标签的方法(定义自定义组件)代码如下(示例):exportdefault{components:{tabVue,’remote-js’:{render(createElement){returncreateElement(‘script’,{attrs:{type:’text/javascript’,src:this.src}});},props:{

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号