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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ucinet网络分析实例(网络分析app)

    ucinet介绍UCINET为菜单驱动的Windows程序,可能是最知名和最经常被使用的处理社会网络数据和其他相似性数据的综合性分析程序。与UCINET捆绑在一起的还有Pajek、Mage和NetDraw等三个软件。UCINET能够处理的原始数据为矩阵格式,提供了大量数据管理和转化工具。该程序本身不包含网络可视化的图形程序,但可将数据和处理结果输出至NetDraw、Pajek、Mage和Kr…

    2022年4月16日
    71
  • JavaScript工作原理(八):Service Workers,生命周期和应用案例

    JavaScript工作原理(八):Service Workers,生命周期和应用案例

    2021年5月27日
    121
  • AD15中PCB设置NET CLASS规则

    AD15中PCB设置NET CLASS规则1,执行菜单命令设计-类或者快捷命令DC计入如下界面2,右键新建一个类类)X*O-K,M9}0C6v3,吧电源和GND网络都加载到右边,PWR类创建完毕 4,这时候在规则里面就可对这个类进行调用和约束…

    2022年7月16日
    13
  • 极限思想之芝诺悖论[通俗易懂]

    极限思想之芝诺悖论[通俗易懂]芝诺悖论是古希腊哲学家芝诺提出的一组悖论。芝诺是一个很有学问,同时也很好玩的人(淘气)。他如果在中国出生,估计很难大学毕业,只能跟池子(脱口秀演员~)一样,高中教室门外面站三年课,然后去讲脱口秀糊口。阿基里斯,大家都知道。古希腊神话中的战神。无论是力量,速度,耐力,格斗技巧,都是巅峰级别的。一夜睡三女,第二天依然可以血染特洛伊的男人。芝诺就提出:在跑步比赛中,如果跑得最慢的乌龟一开始领先…

    2022年6月18日
    35
  • matlab中示波器的用法_示波器单次触发设置

    matlab中示波器的用法_示波器单次触发设置在做Simulink仿真时,使用的Scope波形显示模块实际上也是一种Figure窗口,不过Matlab把Scope的菜单栏隐藏起来,只提供了几个有限的参数设置。如果需要对Scope中的图加上坐标、更改界面背景色等,没有菜单栏就基本上无从下手了。可以在打开你的mdl文件之后,在Matlab的命令行输入以下指令来恢复显示Scope的Figure菜单栏:>>set(0,’ShowHidd…

    2022年10月12日
    1
  • MATLAB语音信号处理「建议收藏」

    MATLAB语音信号处理「建议收藏」数字信号处理课设,我们使用MATLAB对语音信号进行了一系列处理,并将其所有功能集中于下图界面中:这个界面涉及功能众多,其中包括语音信号的观察分析、音色变换、AM调制解调、减抽样、加噪去噪、相频分析和幅频滤波等,最重要的是对MATLAB中函数的掌握,通过不同函数的组合实现你想要实现的功能。本篇不会给出整个界面的程序,下面会分块给出每个功能的程序,整个界面只需GUI设计界面文件…

    2022年5月26日
    41

发表回复

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

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