【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


相关文章
|
8月前
|
Java
|
8月前
|
存储 Java
|
6天前
|
存储 Java 编译器
JavaSE学习--数据类型和运算符
JavaSE学习--数据类型和运算符
64 0
|
9月前
|
存储 Java C语言
教你精通JavaSE语法->第三章、运算符
计算机的最基本的用途之一就是执行数学运算,即:对操作数进行操作时的符号,不同运算符操作的含义不同。-------->复习或初学Java语法
50 0
|
10月前
|
Java 编译器
【JavaSE专栏8】运算符、表达式和语句
【JavaSE专栏8】运算符、表达式和语句
|
6月前
|
存储 机器学习/深度学习 Java
【JavaSE语法】运算符
【JavaSE语法】运算符
44 0
|
7月前
|
存储 Java C语言
JavaSE ---01 数据类型与运算符
JavaSE ---01 数据类型与运算符
18 0
|
7月前
|
存储 Java 编译器
基本语法、数据类型与运算符【JavaSE】
基本语法、数据类型与运算符【JavaSE】
20 0
|
9月前
|
Java C语言
《JavaSE-第三章》之运算符
《JavaSE-第三章》之运算符
|
10月前
|
存储 Java C语言
【javaSE】 运算符
【javaSE】 运算符