【JAVASE】运算符(三)

简介: 【JAVASE】运算符

6. 移位运算符


移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。


**1. 左移 <<:最左侧位不要了,最右侧补 0 **

例如:


int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果按十六进制打印

图解:


1d51006c4f3b0ec91dc9eb1417ff520e_9d8cac5b80f1488a9e59c1170e608dda.png


运行结果:


232b9df3c5f33861454acb68e12b42f4_fb7c98c8e276445bbedc1ea3330f3f6e.png

向左移位时,丢弃的是符号位,因此正数左移可能会编程负数


2. 右移 >>:最右侧位不要了,最左侧补符号位(正数补 0,负数补 1)

例如:


int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果按十六进制打印

图解:


6230eaf7ef83df42691f83f2199da7cf_ff508938528c4a60986c43222e0ab233.png


运行结果:


fba72fe62db777b01f1ad823a5cb3594_4ae49476961c44d4b9c3a9a9b6291dc5.png


3. 无符号右移 >>>:最右侧位不要了,最左侧补 0


int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);

运行结果:


48b709f5d9509b907beadaadbdb341ce_d7d39d29b66e44f59f42164ffb62dde8.png


注:


  • 左移 1 位,相当于原数字 * 2. 左移 N 位,相当于原数字 * 2 的N次方
  • 右移 1 位,相当于原数字 / 2. 右移 N 位,相当于原数字 / 2 的N次方
  • 由于计算机计算移位效率高于计算乘除,当某个代码正好乘除 2 的N次方的时候可以用移位运算代替
  • 移动负数位或者移位位数过大都没有意义


7. 条件运算符


条件运算符只有一个:

表达式1 ? 表达式2 : 表达式3


  • 当 表达式1 的值为 true 时,整个表达式的值为 表达式2 的值
  • 当 表达式1 的值为 false 时,整个表达式的值为 表达式3 的值
  • 也是 Java 中唯一的一个 三目运算符,是条件判断语句的简化写法


例如:求两个整数的最大值


int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);

运行结果:


e2f114170f113785b69314f734e8dcca_2b74761e1a194974979d9d01bbd9302e.png


注:


  • 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
  • 表达式不能单独存在,其产生的结果必须要被使用


int a = 10;
int b = 20;
a > b? a : b; // 报错:Error:(15, 14) java: 不是语句


8. 运算符的优先级


在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 +和 - 。


观察下段代码是否正确:


// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;//右移一位相当于 /2
System.out.println(c);

运行结果:


481f5192b87ae687c0949466e49e62b2_c203cd5abef34c7cb310fee6ceb2f936.png

为什么结果和我们想的不一样?


这是因为在上述表达式中,由于 + 的优先级要高于 >> ,因此 a 先和 b-a 的结果做加法,整体为20,最后再进行右移,因此结果为 10 。


为了不被优先级干扰,我们可以在恰当的位置加上括号:

int a = 10;
int b = 20;
int c = a +( (b - a) >> 1 );//右移一位相当于 /2
System.out.println(c);

运行结果:

de728d9a047736659d3af42965e1e09c_a999d156ba4b4fbebe1f2624770ed4f9.png


相关文章
|
前端开发 JavaScript 数据管理
前端框架对比:React、Vue与Angular
【7月更文挑战第2天】React、Vue和Angular是前端三大框架,各有特色。React以组件化和虚拟DOM著称,适合大型SPA;Vue轻量且易用,适用于快速开发;Angular是全面解决方案,适合复杂应用,但学习成本高。选择取决于项目需求和团队技能。
|
SQL 数据可视化 定位技术
见证数据的视觉奇迹——DataV Atlas
阿里云DataV的DataV-Atlas是一款专注于地理数据可视化的工具,提供时空数据分析和地图发布功能,适合快速创建地图并分享。与ArcGIS Server相比,DataV.GeoAtlas更侧重于数据可视化和云服务集成,适合非专业用户,而ArcGIS Server是全面的GIS服务平台,适合复杂分析和定制化应用。用户可通过阿里云免费试用DataV-Atlas,体验包括数据上传、地图制作和分析在内的功能。
见证数据的视觉奇迹——DataV Atlas
leetcode代码记录(杨辉三角
leetcode代码记录(杨辉三角
102 1
Qt6自定义QML控件的方式
Qt6自定义QML控件的方式
437 1
|
TensorFlow 算法框架/工具 Python
成功解决File "frozen importlib._bootstrap", line 219, in _call_with_frames_removed ImportError: DLL lo
成功解决File "frozen importlib._bootstrap", line 219, in _call_with_frames_removed ImportError: DLL lo
成功解决File "frozen importlib._bootstrap", line 219, in _call_with_frames_removed ImportError: DLL lo
|
前端开发 Java Maven
Gradle笔记 七 publishing 项目发布(二)
Gradle笔记 七 publishing 项目发布
419 0
|
Java 关系型数据库 MySQL
Eclipse使用JDBC连接MySQL数据库详细教程
Eclipse使用JDBC连接MySQL数据库详细教程
1996 0
|
运维 资源调度 Kubernetes
「开源人说」第五期 | KubeVela:一场向应用交付标准的“冲锋”
「开源人说」第五期聚焦云原生领域开源至今仅两年多的项目——KubeVela,将镜头对准 KubeVela 项目背后的代码贡献者和落地实践者,讲述这个从第一天就诞生在社区的技术,如何走到对不同场景应用“海纳百川”,直至成为 CNCF 孵化项目,并逐渐向应用交付领域的事实标准演进的故事。 阅读下文,让我们跟随 KubeVela 创始团队,一起了解它的开源背后的故事。
199880 1
「开源人说」第五期 | KubeVela:一场向应用交付标准的“冲锋”
|
机器学习/深度学习 编解码 人工智能
GANet:基于关键点的全局关联车道线检测网络(CVPR2022)
车道检测是一项具有挑战性的任务,需要预测车道线的复杂拓扑形状并同时区分不同类型的车道。早期的工作遵循自上而下的路线图,将预定义的锚回归到各种形状的车道线,由于锚形状固定,缺乏足够的灵活性来适应复杂的车道形状。
GANet:基于关键点的全局关联车道线检测网络(CVPR2022)