作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。
Java运算符可以分为算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符以及其他运算符。
我们这篇文章主要讲一下 算数运算符 、 逻辑运算符 和 位运算符。
算数运算符:
加减乘除四则运算我们就不需多说了,这里我们稍微提一下“除”(/)吧,学过数学的人都知道,除数不能为0,在Java中当然也不能意外,如果除数为0,那么程序就会抛出算数异常(ArithmeticException)。
取模运算符(%)用的还是蛮多的,取模也就是取余的意思,求一个数的余数。取模运算符和除法运算符结合起来可以求出一个数的每一位。
System.out.print("请输入一个四位数:");
Scanner s = new Scanner(System.in);
int num = s.nextInt();
if(num<10000 && num>999)
{
System.out.println("输入的数为:"+num);
System.out.println("个位:"+num%10+"\t"+"十位:"+num/10%10+"\t"+"百位:"+num/100%10+"\t"+"千位:"+num/1000);
}else{
System.out.println("输入数据不符合要求!");
return;
}
结果:
请输入一个四位数:3781
输入的数为:3781
个位:1 十位:8 百位:7 千位:3
我们应用取模运算符的时候操作数一般都为正整数,但世界之大,无奇不有,万一让你计算一下负数之间应用取模运算符进行运算的话是不是就有些懵逼了
,那我们接下来就看看涉及到负整数的取模运算符的计算结果有什么规律。
System.out.println(10%3);
System.out.println(10%-3);
System.out.println(-10%3);
System.out.println(-10%-3);
猜测一下这四个表达式的值是什么?
结果:
10%3的值为:1
10%(-3)的值为:1
(-10)%3的值为:-1
(-10)%(-3)的值为:-1
根据这个程序我们可以得出一个结论,如果涉及到负整数的取余运算,那所得出的取余结果的符号与被取余数的符号相同,和取余数的符号无关!
最不好理解的当然是自增和自减运算符了!下面我们着重讲一下。自增运算符和自减运算符都分为两种:前缀式自增(自减)和后缀式自增(自减),其实自增运算符和自减运算符的原理是相同的,明白了一种就全明白了,我们先拿自增运算符进行解释。
int a = 0;
int b = 1;
a = b++;
System.out.println("a= "+a);
System.out.println("b= "+b);
代码中,a = b++; 自增运算符(++) 放在操作数的后面叫做后自增,也就是先返回值再自增。大家猜一下这串代码的结果是什么?
结果是:
a= 1
b= 2
和你想的是不是一样呢?
解释一下:对于表达式 a = b++; 这个表达式可表示为两个表达式: a = b; b++; 也就是说先将 b 的值 1 赋值给 a ,这样 a 的值就从 0 变成了 1 ,所以 a = 1; 然后 b 再自增,也可以理解为 b = b +1 ,所以 b 的值就从 1 变成了 2 ,所以 b =2;
我们再来看一个例子。
int a = 0;
a = a++;
System.out.println("a = "+a);
这个式子的结果是什么呢?猜猜看!
结果:
a = 0
为什么 a 最终的结果会是 0 呢?大家可以想想看,想明白了可以文章底部留言哦,我们相互探讨一下。哈哈.....
那我们再看看前自增运算符吧。
int a = 0;
int b = 1;
a = ++b;
System.out.println("a= "+a);
System.out.println("b= "+b);
代码中,a = ++b; 自增运算符(++) 放在操作数的前面叫做前自增,也就是先自增再返回值。大家猜一下这串代码的结果是什么?
结果是:
a= 2
b= 2
解释一下:对于表达式 a = ++b; 这个表达式也可表示为两个表达式: b++; a = b; 也就是说 b 先自增,也就是 b = b+1; 这样,b 的值就从 1 变成了 2 ,然后 a = b ;这样 a 的值 也就从 0 变成了 2 。
来来来,咱再来看个表达式,你们来猜一下。
int a = 0;
a = ++a;
System.out.println("a= "+a);
这个式子的结果是什么?
结果:
a = 1;
是不是和你想的一样?当然了,这一点都没难度
自减运算符和自增运算符的原理相同,懂了一个,另一个也就不叫事儿了。
赋值运算符:
一听这个名字,就知道赋值运算符的作用是用来赋值的。赋值运算符理解起来非常简单,我们就不浪费口舌详细介绍了。先说一下 “+=”、“-=”、“*=”、“/=”、“%=”的理解吧,比如表达式 num += 10; 就可理解为 num = num +10; 的意思。其他的都类似。
那使用赋值运算符有什么好处呢?
在程序中实现相同的功能,使用赋值运算符占据的内存要少一些
关系运算符:
使用关系运算符的表达式的返回值为Boolean 类型,也就是 true 或 false。
比较运算符是程序设计中实现数据比较的基础,也是很多逻辑实现的基础,在程序逻辑中,经常通过比较一定的条件,来判断后续的程序该如何执行。
逻辑运算符:
逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型。我们的比较运算符只能进行一次判断,对于对此判断无能为力,那么逻辑运算符就可以经将较运算符连接起来。
下面我们用一段程序输出一下他们的运算规律和结果。
//逻辑与 & 二元运算符,只要有个参与逻辑与运算的 操作数 为 false 那么整个逻辑表达式的结果就为false。
//有false 就是false,全 true 才 true。
System.out.println(false & true);//false
System.out.println(true & false);//false
System.out.println(false & false);//false
System.out.println(true & true);//true
System.out.println("************************************");
//逻辑或 | 有true 则 true ,全false 则false。
System.out.println(false | true);//true
System.out.println(true | false);//true
System.out.println(false | false);//false
System.out.println(true | true);//true
//逻辑异或 ^ 相异为true,,相同为 false。
System.out.println("************************************");
System.out.println(false ^ true);//true
System.out.println(true ^ false);//true
System.out.println(false ^ false);//false
System.out.println(true ^ true);//false
//逻辑非 ! 一元运算符 对boolean 值取反 true --> false false -- > true
int a = 9;
System.out.println(!false);//true
System.out.println(!true);//false
System.out.println(!(++a == a++));//false
System.out.println("************************************");
//短路与 && 规律,和使用的结果 和 逻辑与一致。
System.out.println(false && true);//false
System.out.println(true && false);//false
System.out.println(false && false);//false
System.out.println(true && true);//true
既然短路与和逻辑与的运算规律一样,那为什么还要创造两个概念呢?或者说逻辑与短路之间有什么不同?
逻辑与:
boolean b1 = 1>2;
int num = 10;
System.out.println(b1&((++num)<15));
System.out.println("num = "+num);
结果:
false
num = 11
boolean b1 = 1>2;
int num = 10;
System.out.println(b1&&((++num)<15));
System.out.println("num = "+num);
结果:
false
num = 10
看一下这两个程序num 的值有没有变化。当运算符是逻辑与时,两个表达式都会被执行,然后再进行与运算;但是当运算符是短路与时,只要第一个表达式的值是false,那第二个表达式就没有被执行,直接输出结果false。逻辑或与短路或的规律也和他们相同。当运算符是逻辑或时,两个表达式都会被执行,然后再进行或运算;但是当运算符是短路或时,只要第一个表达式的值是true,那第二个表达式就没有被执行,直接输出结果true。
所以,短路与 与 短路或 执行的效率 比 逻辑与 和 逻辑或 的效率要高。
位运算符:
位运算符和逻辑运算符很相似,处理方法也很相似。我们可以把使用位运算符的表达式里的1看作逻辑表达式里的true,0看作false。
他们的规则也极其相似:
只有参与运算的两位都为1,&运算的结果才为1,否则就为0。
只有参加运算的两位都是0,|运算的结果才是0,否则都是1。
只有参加运算的两位不同,^ 运算的结果才为1,否则就为0。
那位运算符有什么用处呢?
&位运算符:
我们若是求一个二进制数的其中几位并打印出来就可以使用与运算符了。比如说我们需要将 0b10011010 的后四位单独打印出来:
System.out.println(Integer.toBinaryString(0b10011010&0xf));
结果:
1010
| 位运算符:
需要定义8个特殊的整数,8个数的所有的排列组合的和的结果都是不同的,用或位运算符要好一些。大家可以想想这个代码应该怎么写......
^ 位运算符:
一个操作数,连续异或同一个数2次,结果是该数自身。我们可以运用 ^ 位运算符做一个简单的加密和解密程序:
String str = "你很漂亮!";
char[] strChar = str.toCharArray();
int key = (int)(Math.random()*100)+1;
System.out.println("key = "+key);
for (char a:strChar)
{
System.out.print(""+(char)(a^key));
}
//解密
System.out.print("请输入要解密的数据:");
Scanner s = new Scanner(System.in);
String str = s.nextLine();
char[] strChar = str.toCharArray();
System.out.print("请输入key的值:");
int key = s.nextInt();
System.out.print("解密后的值为:");
for (char a:strChar)
{
System.out.print(""+(char)(a^key));
}
对于程序菜鸟,撩妹的时候要是这么玩一下,是不是也别有一番风味呢.....
还有左移运算符(<<)和 (带符号)右移运算符(>>):
左移规则:直接移走高位指定的位数 低位补0。
右移规则:低位被挤走,高位补符号位 正数补0 负数 补1
应用:若是求一个在一定范围的数乘 2 或除 2 的 n 次幂,使用 左/右 移运算符应该是最快的计算方法了。
无符号右移运算符(>>>):
规则: 低位被挤走,高位补0
应用:随机得到一个正整数
Random random = new Random();
int ran = random.nextInt() >>> 1;
System.out.println(" ran= "+ran);
条件运算符:
Java中唯一的三目运算符。
语法:
[第一部分] ? [第二部分] : [第三部分]
第一部分:必须返回一个boolean 值。
如果第一部分 结果为true ,那么执行 第二部分。
如果第一部分 结果为 false ,那么跳过第二部分,执行第三部分。
注意:第二部分,和第三部分,返回的值的类型必须兼容。
举例:
int a = 1;
int b = 2;
int c = a>b?a:b;
System.out.println("c = "+c);
结果:
c = 2