运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符:
运算符 |
运算 |
范例 |
结果 |
+ |
正号 |
+3 |
3 |
- |
负号 |
b=4; -b |
-4 |
+ |
加 |
5+5 |
10 |
- |
减 |
6-4 |
2 |
* |
乘 |
3*4 |
12 |
/ |
除 |
5/5 |
1 |
% |
取模 |
7%5 |
2 |
++ ++ |
自增(前):先运算后取值 自增(后):先取值后运算 |
a=2;b=++a; a=2;b=a++; |
a=3;b=3 a=3;b=2 |
- - - - |
自减(前):先运算后取值 自减(后):先取值后运算 |
a=2;b=- -a a=2;b=a- - |
a=1;b=1 a=1;b=2 |
+ |
字符串相加 |
“He”+”llo” |
"Hello" |
注意:1) /: int i = 12; i = i / 5;整数之间做除法时,只保留整数部分而舍弃小数部分。
2) %:最后的符号只跟被模数相同
3)前++:先+1,后运算 后++:先运算,后+1
4)+:String字符串与其他数据类型只能做连接运算,且结果为String类型。
赋值运算符:
= += -= *= /= %=
int i= 12;
i = i * 5;
i *= 5;//与上一行代码同样的意思
注意:
short s = 10;
s = s + 5;//报编译的异常
s = (short)(s + 5);
s += 5;//s = s + 5,但是结果不会改变s的数据类型。
比较运算符(关系运算符):
== > < >= <= instanceof
注意:区分== 与 = 区别。
进行比较运算操作以后,返回一个boolean类型的值
4>=3 表达的是4 > 3或者 4 = 3.结果是true。
if(i > 1 && i < 10){ }
不能写为:if(1 < i < 10){}
逻辑运算符:
a |
b |
a&b |
a|b |
!a |
a^b |
a&&b |
a||b |
true |
true |
true |
true |
false |
false |
true |
true |
true |
false |
false |
true |
false |
true |
false |
true |
false |
true |
false |
true |
true |
true |
false |
true |
false |
false |
false |
false |
true |
false |
false |
false |
1、&与
true & true = true ; false & true= false; true & false = false; false & false= false;
& : 只有两边都为true ,将结果为true.
2、&& 短路
&运算只有两边全为真的时候,结果才为真,那么当左边为假的时候就没有必要在进行判断,&&就产生了。
int a =4;
a >3 && a< 6;
a >3 & a< 6 ;
在这种情况下世没有区别的
如果:
a =2
a >3 & a< 6 2大于 3为假,接着运算 2小于6为真,总的结果为假
a >3 && a< 6; 此时a不大于3结果为false右边不运算了.即短路.所以&&比&效率稍微高了一点.
【注意】区分 & 与 && 的区别,以及 | 与 || 的区别
“&”和“&&”的区别:单与时,左边无论真假,右边都进行运算;双与时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,双或时,左边为真右边不参与运算。
我们使用的时候,选择&& , ||
3、| 或
true | true =true; ture | false =true; false | true =true; false | false =flase;
总结 | : 两边只要有一个为真结果就为真,当两边同为假时结果才为假.
4、^ 异或
true ^ true =false; ture ^ false =true; false ^ true= true; false ^ false=flase;
^ : 两边相同结果是false
位运算符:位运算是直接对二进制进行运算
运算符 |
运算 |
范例 |
<< |
左移 |
3 << 2 = 12 --> 3*2*2=12 |
>> |
右移 |
3 >> 1 = 1 --> 3/2=1 |
>>> |
无符号右移 |
3 >>> 1 = 1 --> 3/2=1 |
& |
与运算 |
6 & 3 = 2 |
| |
或运算 |
6 | 3 = 7 |
^ |
异或运算 |
6 ^ 3 = 5 |
~ |
反码 |
~6 = -7 |
位运算符的细节 |
|
<< | 空位补0,被移除的高位丢弃,空缺位补0。 |
>> | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 |
>>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
| | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; |
^ | 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1 |
~ |
正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反 |
1、左移 (算术移位)
3<< 2 是如何在计算机里是实现的?
首先将3转换为2进制,
00000000 |
00000000 |
00000000 |
00000011 |
3 的二进制 |
||
00000000 |
00000000 |
00000000 |
000011 |
左移2位,砍掉高位 |
||
0000 0000 |
0000 0000 |
0000 0000 |
0000 1100 |
低位补0 |
结果是12,所以3<<2 =12;
结论:左移就相当于乘以2的位移个数次幂.
2、右移
6>>2
00000000 |
00000000 |
00000000 |
00000110 |
6的二进制 |
||
000000 |
00000000 |
00000000 |
00000001 |
右移10被砍掉 |
||
00000000 |
00000000 |
00000000 |
00000001 |
高位补0 |
结果是1,所以6>>2 =1;
结论一个数往左移越移越大,往右边移越来越小.
推论
3<<2=12; 3<<1=6 ; 3<<3=24;
3*4=12 ; 3*2=6; 3*8=24;
3*22=12; 3*21=6 3*23 =24;
结论往左移几位就是乘以2的几次幂。
右移规律
6>>2=1 ;6>>1=3 ;
6/4=1 ; 6/2=3 ;
右移两位就是除以 2的2次方,右移一位就是除以2的一次方。
总结 :>> 是除以2的移动位数次幂
<< 是乘以2的移动位数次幂
用处:最快的运算是位运算。
3、无符号右移 (逻辑移位)
通过演示发现右移时高位就空了出来, >>右移时高位补什么要按照原有 数据的最高位来决定。
1111-1111 1111-1111 1111-1111 1111-1010 -6>>2
1111-1111 1111-1111 1111-1111 1111-0010
最高位补什么要看原有最高位是什么
那么使用>> 后原来是最高位1的那么空出来的最高位还是1的,是0的还是0。
如果使用>>> 无论最高位是0还是1空余最高位都拿0补,这就是无符号右移。
1111-1111 1111-1111 1111-1111 1111-1010 -6>>>2
001111-1111 1111-1111 1111-1111 1111-10
结果是;1073741822
4、& 与运算
& 参见运算的两位数都为1,&运算符结果才为1,否则就为0。
6&3
5、| 或运算
| 参与运算的两位都为0,|运算的结果才为0,否则就为1。
6、^ 异或运算
^只有参加运算的两位不同,^运算的结果才为1,否则就为0。
异或特点
一个数异或同一个数两次,结果还是那个数. 用处一个简单的加密思想.
6^3^3
7、 ~取反
就是取反,二进制只有1和0,取反就是如果为1,取反就是0,如果是0,取反就是1。
System.out.println(~6);//-7
结论:当参与取反的数值是正数时,把对应的值加上负号,再-1;
当参与取反的数值是负数时,把对应的值加上负号,再-1;
负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1。
负数表示
负数对应的正数的二进制取反,然后+1。
-6
三元运算符:
(条件表达式)? 表达式1 : 表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
示例:
1.获取两个数中大数。
int x=3,y=4,z;
z = (x>y)?x:y;//z变量存储的就是两个数的大数。