java-运算符
运算符
本篇文章只讨论了几点关于运算符易错且需要注意的知识点,易于理解以及很常见的没有提及
算数运算符
-
问:大家都知道运算符分为单目与双目运算符,那么单目与双目到底是什么意思呢?
答:单目就是需要一个对象就可以完成的运算,例如:a++,b--、、、,同理,双目就是需要两个对象,比如:a+b、c*d、、以此类推,还有三目等
-
问:双目有哪些?
答:双目主要有5种,分别是(+)(-)(*)(/)(%)
System.out.println(5%2); //1 System.out.println(5%2.5);//0.0 System.out.println(5%5); //0
原理上,%仅用于整数类型的运算,上述代码显示,在java里面,%可以运算符点数,但是结果同样符点数,如果运算整数,则结果仍为整数。
-
问:单目有哪些?
答:++、--、-(取反)
逻辑运算符
-
问:有哪几种?
答:共6种,&(与)、|(或)、!(非)、^(异或)、&& (条件与)、| (条件或)
-
问:(与、或)和(条件与、条件或)的区别?
答:运算的效果都一样,但是&&、|| 的效率更高,更常用,具有短路运算的功能
false&&true //false
上述代码,从左向右计算时,由于是与运算且第一个是false,因此结果必定是false,程序便不再判断右边的真假。
位运算符
-
问:种类及用法?
答:7种,~(位反)、&(位与)、|(位或)、^(位异或)、<<(左移位)、>>(右移位)、>>>(无符号右移位),位运算是对整数类型的操作数以二进制进行的运算,结果仍为整数。
//位反(~) int a=36,b=12 //以二进制表示a=100100,b=1100 System.out.println(~a) //-133
上述代码是取反操作,a的二进制为100100,取反后应为011011,所以理论上运算结果为27,但是结果却是-133,要搞懂这个,先要了解几个知识点,
-
原码:原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011
-
反码:反码的作用即使解决对负数进行加法运算的问题,正数的反码是其本身,负数的反码是除了符号位外,其余取反
例如+1 用8位表示,原码:0000 00001 反码:0000 0001
-1 原码:1000 0001 反码:1111 1110
-
补码:正数的补码是其本身,负数的补码是其原码加1
由于Java的取反运算是在补码的基础上计算的,且二进制是32位 了解了以上知识之后,再来看,取反的运算过程:
- 36转换为二进制 00000000000000000000000000 100100
- 36的补码为:00000000000000000000000000 100100
- 对补码取反:11111111111111111111111111 011011
- 取反后的补码转换到原码才能计算出结果;原码 = 反码符号位不变,其余取反
- 计算取反后补码的反码,10000000000000000000000000 100100
- 原码=11111111111111111111111111 011011
-
- 计算结果:System.out.println(ob11111111111111111111111111011011) //-37
规律:~x=-(x+1);
//位与(&)
int a=2,b=3,result; //二进制表示 a=10 b=11
System.out.println(a&b); // 2
//位或(|)
System.out.println(a|b)// 3
上述代码为位与和位或运算,a=10,b=11,逐位进行与操作后为result=10,换算成十进制即为2,同理,进行或操作后结果为3。
//异或(^)
int a=2,b=3,result; //二进制表示 a=10 b=11
System.out.println(a^b) // 1
上述代码为异或运算,异或的运算规则为,二进制相同位置上,值相同则取0,不同则取1
a=10
b=11
result=01
所以结果为1
//左移、右移
int a=12,b=2;// 二进制表示a=1100 b=10
System.out.println(a<<b);//48
System.out.println(a>>b);//3
上述代码为左移、右移运算,规律就是,左移x位就是乘以2的x次方倍,左移x位就是除以2的x次方倍,
a=12,乘以4,所以结果为48,12除以4,结果为3;