java运算符:
定义:用来指明对于操做数的运算方式
按照操做数数目分类:
单目运算 数目运算 三目运算
a++ a+b (a>b) ? x:y
按照运算符功能分类:
算术运算符:
+ - * / %(取余/取模)
++ 自增
-- 自减
注:int x = 1; int y = x++ 将x变量空间的内容先取出,而后将常量区的1取出x在像作
值交换的时候会产生一个临时的副本空间,++(--)在变量前面则先自增后备份,++(--)在
变量后面则先备份后自增,=号是将备份空间中的值赋值给别人
例:
int m =1;
int n =2;
int sum = m++ + ++n - n-- - --m + n-- - --m ;
System.out.println("m="+m+", n="+n+", sum="+sum);
m =0 n =1 sum = 2
赋值运算符:
= 赋值号
+= int x=1 x+=10 ; 至关于 x = x+10 // 11
-= int x=10 x-=10 ; 至关于 x = x-10 // 0
*= int x=10 x*=10 ; 至关于 x = x*10 // 100
/= int x=10 x-=10 ; 至关于 x = x/10 // 1
%= int x=10 x%=10 ; 至关于 x = x%10 // 0
注:
byte a = 1;
a +=1; //2
a = a+1;//编译报错
a = (byte)(a+2) // 强制转换,经过
讲解:计算机中+=至关于一个运算符,会先用+符号自动的将byte提高为32bit的int类型
来进行计算,而后在经过=运算符将32bit位的int类型自动降为8bit的数据来存入a
中,可是a=a+1中的=和+属于两个运算符,+将byte中的1提高为32bit来个常量池
中的1进行相加,可是=赋值时在将32bit位的数据赋值到8bit位中的a空间中,会出
现编译报错
总结:
单个运算符后台编译能够自动提高或者下降bit位来知足赋值或者计算,可是赋值
号以后不能自动降级方程式,须要强制转换
位运算符:
&按位与 | 按位或 ^ 按位异或 ~ 按位取反
<<按位左位移 >>按位右位移 >>>按位又位移(无符号)
例: 3 & 5 = ? 3 | 5 = ? 3 ^ 5 = ? ~ 6 = ?
解: 将3 和 5分别换算成二进制
3 = 00000000 00000000 00000000 00000011 = 011
5 = 00000000 00000000 00000000 00000101 = 101
因此按位&即将011和101进行按位&后在化成10进制(true 为 1 false 为 0)
0 1 1
1 0 1
0 0 1 = 1
因此按位 | 即将011和101进行按位 | 后在化成10进制(true 为 1 false 为 0)
0 1 1
1 0 1
1 1 1 = 7
因此按位 ^ 即将011和101进行按位^后在化成10进制(true 为 1 false 为 0)
0 1 1
1 0 1
1 1 0 = 6
因此按位 即将101进行按位 ~ 后在化成10进制(true 为 1 false 为 0)
~6 = -7
解释:计算机将0划分在正数行列,因此 -1<-->0 -2 <--->1 -3<--->2 故 -7<-->6
6 (正数三码相同)
00000000 00000000 00000000 0110 (原码)
00000000 00000000 00000000 0110 (反码)
00000000 00000000 00000000 0110 (补码)
-6 (负数三码不一样)
10000000 00000000 00000000 00000110 (原码)
11111111 11111111 11111111 11111001 (反码:保持符号不动其他取反)
11111111 11111111 11111111 11111010 (补码:在反码基础上+1)
计算机中无论是整数仍是负数,存储的形式都是以补码形式来存储
注:反码是一种表示形式 取反是一个计算过程
<<按位左位移:
6<<1=?
00000110 = 00001100 = 12
因此往左移至关于*2的位移次幂
6>>1=?
00000110 = 00000011 = 3
因此往左移至关于/2的位移次幂
负数
-6 >>>1
11111111 11111111 11111111 11111010(以补码计算)
?1111111 11111111 11111111 11111101
注: >> 保留符号位1填1
>>> 不保留符号 无论是什么都填0