首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c语言中的异或运算_java中的异或运算符

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

作者头像
全栈程序员站长
发布于 2022-11-10 05:36:53
发布于 2022-11-10 05:36:53
1.7K0
举报

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

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

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

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++中得到了想要的结果

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

怎么样,是不是很惊讶,在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.cn/188958.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月27日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】三、OpenGL渲染多视频,实现画中画
距离上次更新已经有两个星期,由于这段时间事情比较多,还请各位关注本系列文章的小伙伴见谅,一有时间我会加紧码字,感谢大家的关注和督促。
开发的猫
2020/04/02
2.7K0
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】三、OpenGL渲染多视频,实现画中画
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】五、OpenGL FBO数据缓冲区
上一篇文章,讲解了如何使用EGL,并且提到EGL可以建立一个离屏渲染的缓冲区,这种离屏渲染的方式通常用于模拟整个渲染窗口,比如可以用于FFmpeg软编码,将显示在虚拟窗口中的画面编码成H264。
开发的猫
2020/04/02
3K0
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】五、OpenGL FBO数据缓冲区
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】一、初步了解OpenGL ES
提到OpenGL,想必很多人都会说,我知道这个东西,可以用来渲染2D画面和3D模型,同时又会说,OpenGL很难、很高级,不知道怎么用。
开发的猫
2020/04/01
2.2K0
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】一、初步了解OpenGL ES
Android OpenGLES渲染MediaCodec解码数据
1、OpenGL生成纹理 2、纹理绑定到SurfaceTexture上 3、用SurfaceTexture做参数创建Surface 4、MediaCodec解码的视频就往Surface发送,就显示出画面了 Shader编写 vertex_shader.glsl attribute vec4 av_Position; attribute vec2 af_Position; varying vec2 v_texPosition; void main() { v_texPosition = af
曾大稳
2018/09/11
2.8K0
OpenGL ES + MediaPlayer 渲染播放视频+滤镜效果
之前曾经写过用SurfaceView,TextureView+MediaPlayer 播放视频,和 ffmpeg avi 解码后SurfaceView播放视频 ,今天再给大家来一篇 OpenGL ES+MediaPlayer 来播放视频。
字节流动
2020/11/30
2.3K0
OpenGL ES + MediaPlayer 渲染播放视频+滤镜效果
[ - OpenGLES3.0 - ] 第四集 视频接入OpenGLES3.0实现特效
@张风捷特烈 2020.12.08 未允禁转 我的公众号:编程之王 联系我--邮箱:1981462002@qq.com -- 微信: ~ END ~
张风捷特烈
2020/12/09
1.8K0
[ - OpenGLES3.0 - ]  第四集  视频接入OpenGLES3.0实现特效
​OpenGL 学习系列---投影矩阵
OpenGL 在观察空间转换到裁剪空间时,需要用到投影矩阵。而在着色器脚本中,也需要提供一个投影矩阵给对应的 u_ProjectionMatrix变量。
音视频开发进阶
2019/07/25
1.2K0
RenderDemo(2):用 OpenGL 渲染视频丨音视频工程示例
渲染是音视频技术栈相关的一个非常重要的方向,视频图像在设备上的展示、各种流行的视频特效都离不开渲染技术的支持。
关键帧
2023/02/14
1.5K0
RenderDemo(2):用 OpenGL 渲染视频丨音视频工程示例
音视频开发之旅(42)-光照基础(一)
环境光(Ambient Lightiing)不来自任何特定方向的光,在经典光照模型中会用一个常量来表示 使用时只需要对其片源着色器添加一个环境光常量,作为gl_Fragcolor的调制即可_
音视频开发之旅
2021/04/19
6150
音视频开发之旅(42)-光照基础(一)
[-综合篇-] 相机、OpenGL、视频、Flutter和SurfaceView
认识一个类,相当于结交一位朋友;看一篇源码,相当于一次顶级的会话; 读一个框架,相当于见证一段思想;做一个程序,相当于创造一个生命; 一次Git提交,相当于记录一次成长;生活也许并非那么美好,但一切可以这么崇高。----张风捷特烈
张风捷特烈
2020/04/30
3.3K0
[-综合篇-] 相机、OpenGL、视频、Flutter和SurfaceView
「Android音视频编码那点破事」第三章,使用OpenGL为Camera添加各种滤镜
  在第二章中,我们通过一个Camera SurfaceTexture纹理,把摄像头数据绘制到这个纹理上,同时TextureView的SurfaceTexture纹理通过id与第一个纹理关联起来,从而把摄像头画面直接绘制到屏幕上。   对OpenGL有一定了解的人可能会知道,要使用OpenGL渲染各种好看的特效,FBO必不可少。通过FBO,我们可以先把摄像头数据绘制到Camera SurfaceTexture纹理上,然后把这个纹理数据再绘制到一个离屏的FBO,我们可以在这个FBO上做各种特效处理,处理完之后再把离屏FBO中的数据绘制到TextureView的SurfaceTexture纹理,也就是手机屏幕上。
阿利民
2022/05/16
7490
「Android音视频编码那点破事」第三章,使用OpenGL为Camera添加各种滤镜
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】四、深入了解OpenGL之EGL
前面的文章就介绍过,OpenGL是基于线程的,直到目前为止,我们并没有深刻的认识到这个问题,但我们知道的是,当我们继承GLSurfaceView.Renderer时,系统会回调以下方法:
开发的猫
2020/04/02
2.7K0
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】四、深入了解OpenGL之EGL
Android中基于OpenGL的特效
大家都知道,给图片加滤镜加特效,通常是对图像进行矩阵运算。通过颜色矩阵的乘法,我们可以对图像中的元素进行变换。 但是,如果需要对实时变化的图像进行实时处理,就不是每种图像变换的方式都可以用了。因为,实时变化的预览图像,会有帧率的压力,我们的处理一定要快。
Oceanlong
2018/08/14
2.2K0
Android中基于OpenGL的特效
OpenGL ES for Android 相机预览
Android上打开摄像头需要camera权限,在Android 6.0及以上的版本需要动态申请权限,在`AndroidManifest.xml`中添加camera权限:
老孟Flutter
2020/09/11
1.1K0
Android OpenGL ES(五)-结合相机
上文中我们已经实现了在纹理上添加滤镜的效果。这编文章就是将OpenGl和相机结合到一起。
deep_sadness
2018/10/10
2.2K0
Android OpenGL ES(五)-结合相机
「Android音视频编码那点破事」第一章,使用SurfaceTexture作为Camera输出
  在Android系统中,使用GPU对摄像头画面进行高效可控的渲染,几乎是必须的。说到GPU就不得不提OpenGL,一组GPU暴露给应用层使用的接口。
阿利民
2022/05/16
1.3K0
「Android音视频编码那点破事」第一章,使用SurfaceTexture作为Camera输出
音视频开发之旅(41)-天空盒
今天我们学习实践天空盒,天空盒的技术本身比较简单,但是却可以做出来很多比较天空、大山、大海、以及VR看房等效果。可以作为背景动态移动,也可以跟随手势或者传感器等进行移动变换。
音视频开发之旅
2021/04/12
1.2K0
音视频开发之旅(41)-天空盒
Android OpenGL ES 实现蓝线挑战特效
这个特效虽然看着很普通,但结合使用者的创意,可以玩出各种各样的花样,下面就来看看如何实现
字节流动
2021/08/12
1.3K0
Android OpenGL ES 实现蓝线挑战特效
OpenGL ES for Android 播放视频
我们都知道Android中有VideoView控件可以直接播放视频,既简单又实用,那么为什么我们还要用OpenGL ES来播放视频呢?那是因为使用OpenGL ES可以做更多的酷炫的动效,比如旋转视频、双指缩放视频、视频的截图、视频的录制、直播、换脸,还有类似“激萌”App里面的特效等这些都是VideoView所无法实现的,而通过OpenGL ES则可以实现这些酷炫的效果,当然这篇文章不会介绍如何这些实现这些效果,如果想了解这些动效请关注我,后面的文章会一一介绍。
老孟Flutter
2020/09/11
1.5K0
Android OpenGL ES(二)-正交投影
平移矩阵和单位矩阵和类似。但是向量[x,y,z,1]前乘这个平移矩阵后的结构就是平移矩阵中定义的偏移量。
deep_sadness
2018/08/30
1.7K0
Android OpenGL ES(二)-正交投影
推荐阅读
相关推荐
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】三、OpenGL渲染多视频,实现画中画
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档