c语言中的异或运算_java中的异或运算符

c语言中的异或运算_java中的异或运算符今天看到一位大神的博客,深受感触。决定也发一篇博客,证明一下我还活着。于是我翻看以前学习时做的一些笔记,整理了一下,得到了一个关于异或运算交换变量变量值的笔记。首先来看下面三组表达式,看起来他们都能实现交换两个变量的值。a=a^b;b=a^b;a=a^b;a=a^(b=b^(a=a^b));a^=b^=a^=b;可实际的情况是,前面2组表…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

今天看到一位大神的博客,深受感触。决定也发一篇博客,证明一下我还活着。于是我翻看以前学习时做的一些笔记,整理了一下,得到了一个关于异或运算交换变量变量值的笔记。

首先来看下面三组表达式,看起来他们都能实现交换两个变量的值。

a = a ^ b;

b = a ^ b;

a = a ^ b;

a = a ^ (b = b ^ (a = a ^ b));

a ^= b ^= a ^= b;

可实际的情况是,前面2组表达式,在C、C++、Java中都能顺利完成变量值的交换。而第3组表达式,却只在C、C++中通过了,而在Java中却得到了意料之外的结果。请看下面的截图

在C、C++中得到了想要的结果

eabbffa03db80b7348894858bcd0a224.png

而在Java中,却得到了这样的结果

6df9a31a223879bb31f28d135d8c4048.png

怎么样,是不是很惊讶,在java中,a的值,换给了b,但不管怎么做,a的值都是0,怎么会这样?百思不得其解。这事就此搁了下来。

过了很长时间之后,在意个偶然的机会中,我在一个关于Java谜题的手册中看到了这个问题,原来这还是Java比较经典的谜题之一了。

原来,事情是这样的。

很久以前,当中央处理器只有少数寄存器时,人们发现可以通过利用异或操作符(^)的属性(x ^ y ^ x) == y来避免使用临时变量,这个惯用法曾经在C编程语言中被使用过,并进一步被融入到了C++中,但是它并不保证都可以正确运行。但是有一点可以肯定:它在Java中肯定是不能正确运行的。

Java语言规范描述到:操作符的操作数是从左向右求值的。为了求表达式 x ^= expr的值,x的值是在计算expr之前被提取的,并且这两个值的异或结果被赋给变量x。在OprDemo程序中,变量x的值被提取了两次——每次在表达式中出现时都提取一次——但是两次提取都发生在所有的赋值操作之前。

下面的代码可以很好的解释其原理,并且解释了为什么会得到这样的结果

// Java中x^= y^= x^= y的实际行为

int tmp1 = x ; // x在表达式中第一次出现

int tmp2 = y ; // y的第一次出现

int tmp3 = x ^ y ; // 计算x ^ y

x = tmp3 ; // 最后一个赋值:存储x ^ y 到 x

y = tmp2 ^ tmp3 ; // 第二个赋值:存储最初的x值到y中

x = tmp1 ^ y ; // 第一个赋值:存储0到x中

从上面的代码可以看出,其实a之所以会为0,是因为a^a造成的,我们知道,两个相同的值异或其值为0.

在C和C++中,并没有指定表达式的计算顺序。当运行表达式x^=expr时,许多C和C++编译器是在计算expr之后才提取x的值的,这使得上述的做法可以得到正确的结果。

那么在Java中,有没有办法使得不使用中间变量的单个表达式来达到这个目的呢?这是可以的,请看下面的代码。

y = (x^= (y^= x))^ y ;这句代码就能够做到

写这么多,最后想说的就是在单个的表达式中不要对同一变量赋值两次,赋值次数多了,就会引起混乱。

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

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

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


相关推荐

  • python面试常见问题有哪些「建议收藏」

    python面试常见问题有哪些「建议收藏」python面试常见问题有:1、Python是如何被解释的;2、什么是PEP8;3、Python是怎样管理内存的;4、什么是Python装饰器;5、Python提供哪些内置类型等等。

    2022年7月5日
    34
  • 2019的10个最佳WordPress画廊插件

    2019的10个最佳WordPress画廊插件在视觉文化时代,如果您的网站包含图片,则它会获得更多的观看次数。研究表明,如果带有照片或视频,您的内容将获得更好的好评。这很有意义,因为大多数人都以视觉为导向,而我们的大脑在视觉上比在文本中更快地处理和理解事物。不仅如此,大多数人都可以在带有图像的情况下更好地处理和理解文本。这就是为什么显示网站上的照片或视频会使内容的参与度提高70%以上的原因。这也是同样的原因,如果您包含图…

    2022年6月5日
    50
  • 粒子群算法(PSO)的Python实现(求解多元函数的极值)

    粒子群算法(PSO)的Python实现(求解多元函数的极值)PSO是寻优算法中比较简单的一种,本文用Python简单实现了PSO算法,用来求解一个五元函数的最大值,并与MATLAB的fmincon函数的运行结果做比较。

    2022年4月29日
    182
  • 游戏是怎么赚钱的 – 进阶篇[通俗易懂]

    游戏是怎么赚钱的 – 进阶篇[通俗易懂]首先回答几个常见的问题1、昨天提到的广州神武,其实是广州多益,主打产品叫做神武,感谢评论区勘误,这个公司创始人徐波也是个挺传奇的故事,然而很抱歉,今天不讲八卦,有兴趣的可…

    2022年7月19日
    26
  • 十种常用代码编辑器

    十种常用代码编辑器1.vscode微软推出的轻量级代码编译器,是本人使用最多的编译器(主要是好玩的插件多),支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。分享下本人的死宅背景~2.NETBEANSNetBeans是Sun公司(2009年被甲骨文收购)在2000年创立的开放源代码供开发人员和客户社区的家园,旨在构建世界级的JavaIDE。NetBeans当前可以在Solaris、Win

    2022年6月23日
    147
  • RabbitMQ 延迟队列实现订单支付结果异步阶梯性通知[通俗易懂]

    RabbitMQ 延迟队列实现订单支付结果异步阶梯性通知[通俗易懂]在第三方支付中,例如支付宝、或者微信,对于订单请求,第三方支付系统采用的是消息同步返回、异步通知+主动补偿查询的补偿机制。 由于互联网通信的不可靠性,例如双方网络、服务器、应用等因素的影响,不管是同步返回、异步通知、主动查询报文都可能出现超时无响应、报文丢失等情况,所以像支付业务,对结果的通知一般采用几种方案结合的补偿机制,不能完全依赖某一种机制。例如一个支付结果的通知,一方面会在支付页…

    2022年5月13日
    46

发表回复

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

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