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;

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 自学3D游戏建模有哪些教材?「建议收藏」

    自学3D游戏建模有哪些教材?「建议收藏」推荐书籍一:《3dsMax2016中文版完全自学手册》《3dsMax2016中文版完全自学手册》以零基础讲解为宗旨,用实例引导读者学习,深入浅出地介绍了3dsMax2016的相关知识、操作技巧和应用实例。此书着重于3dmax功能的讲解和介绍,实战训练较少,基础讲解不够深入。适用人群:对3dmax软件操作不熟悉的小白,想了解更多功能范围的设计师推荐书籍二:《ZBrush2018从入门到精通》《ZBrush2018从入门到精通》全书总共730页,27大章节,随书配送.

    2022年5月19日
    64
  • 工作笔记

    工作笔记

    2021年11月29日
    40
  • 分布式、多线程、高并发都不懂,拿什么去跳槽

    分布式、多线程、高并发都不懂,拿什么去跳槽当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程?当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼?确…

    2022年5月30日
    29
  • Graph(2014辽宁ACM省赛)[通俗易懂]

    Graph(2014辽宁ACM省赛)

    2022年2月3日
    48
  • SpringAOP学习–SpringAOP简介及原理

    SpringAOP学习–SpringAOP简介及原理前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOP。Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利。前文提到AOP的实现有AspectJ、JDK动态代理、CGLIB动态代理,SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理。JDK动态代理回顾上一篇简单介绍了

    2022年8月11日
    6
  • 方程自己解(1)——物理信息神经网络(PINN)

    方程自己解(1)——物理信息神经网络(PINN)文章目录前言(一)物理神经网络(PINN)解读1.1PINN基本背景1.2PINN算法描述前言  最近正在看利用“深度学习”(大概吧,其实只是利用了neuralnetwork的自动微分特性(AD)),在看一些文章的同时,将文章中提到的开源代码用起来和复现一些基本方程求解能够加快我学习的进度,这里将持续贴出一些方程和代码的求解过程。当然非常希望同学和朋友们可以给我指出错误,最后如果能够坚持下去,这个系列的工作会分享到github,同时如果对各个开源程序有所帮助那就更好了!  由于会参考到很多文章

    2025年8月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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