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


相关推荐

  • mysql的float取值范围_mysql float精度与范围总结 – numeric「建议收藏」

    mysql的float取值范围_mysql float精度与范围总结 – numeric「建议收藏」…是ture,不适用范围:不适用于检测可为0的参数。is_numeric();——只适用于检测数字,但假如参数名不存在,会出错,因此不适合于第一层检测。综合示例:复制代码代码如下:FLOAT类型用于表示近似数值数据类型。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应FLOAT列的4…

    2025年6月8日
    3
  • 申请测试微信公众号流程_如何申请免测

    申请测试微信公众号流程_如何申请免测申请测试微信公众号申请的地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/ind

    2022年8月5日
    7
  • Android退出应用程序方法总结[通俗易懂]

    Android退出应用程序方法总结[通俗易懂]Android退出应用程序方法总结在Android开发中,我们运行了应用程序后,都需要退出应用的,那么该如何退出应用,又都有哪些实现方式呢?今天就为大家整理分享一些退出应用程序的方法,一起来看看吧!更新内容Ver:v1任务管理器方法补充 新增监听式退出方法Ver:v2任务管理器方法修正 新增销毁任务栈退出方法1.finish方法finish();该方法只是结束当前Activity,系统将最上面的Activity移出了栈,并没有清理占用的资源。如果栈内有很多Activ

    2022年7月17日
    17
  • RewriteRule参数

    RewriteRule参数在重写规制的最后,也可以附加一个或多个标记参数(用逗号分开),从而为新的URL地址添加特殊的标志。这些参数是特殊的RewriteRule命令,并且不是普通的正则表达式,下表列出了一些常用的RewriteRule参数。这些重写标记必须被置于单条规则最后的括号内,多个标记需要适用逗号分开,例如”[NC,L]”RewirteRule标记含义描述RRedirect

    2022年5月14日
    44
  • 动态规划之背包问题及输出背包具体方案[通俗易懂]

    动态规划之背包问题及输出背包具体方案[通俗易懂]题型1:LintCode92.背包问题题目:在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]。分析:dp[i][j]:当背包总重量为j且目前有i个物品时,背包最多装满dp[i][j]的空间。      状态转移方程为:dp[i][j]=max{dp[i-1][j-A[i-1]]+A[i-1],dp[i-1][j]},其中dp[i-1][j-A[…

    2022年7月26日
    12
  • Object到int的转换问题

    怎么把一个Object对象转成一个int型的数据,其实这个Object对象里存的是数字!             强制转换不好使!Objectobj=3;  inti=(int)obj;   ——有问题。 解决方法      Integer.parseInt(obj.toString);

    2022年4月5日
    57

发表回复

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

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