你的位置:首页 > Java教程

[Java教程]运算符

算术运算符:

  • +、-、*、/、%:

%  取模运算   可以得到两个数相除的余数

  • ++、-- 自增、自减:

++example  前++

int b = ++a;//相当于a= a+1;b=a;a自增处理完后再把值赋给int数据类型b变量
int a = 13;int b = ++a;//前加加 由a = a+1;b = a; 推出int a = 14,int b = 14;

example++  后++

int b = a++;//相当于b = a;a = a+1;a赋值给变量b之后a自增
int a = 13;int b = a++;//后加加 由b = a;a = a+1; 推出int b = 13,int a = 14;

 编译出错  意外类型

int b = ++(++a)--;/*
前后加加有规范,不能随心所欲处于栈空间不稳定状态,无法读取a类型以及具体数值,确定不了类型于是报出:意外类型错误*/

自减同理


 

  • 复合赋值运算符:

+=、-=、/=、%=、&=、|=、>>=、<<=、^=:

a += b;//即a = a + b;

以此类推


 

  • 关系运算符:

>、<、==、>=、<=、!=  大于、小于、等于、大于等于、小于等于、不等于


 

  • 逻辑运算符:

用于判断逻辑关系的运算符  

&&  与

true && false //falsetrue && true //true

||  或

true || false //truetrue || true //true

!  非

!true == false //false!false == true //true

总结:

与 全真才是真  

或  只要有一个条件为真即是真  

非  结果取反


 

  •  位运算符:

按位与运算符  &

0 & 0 = 0;0 & 1 = 0; 1 & 1 = 1;3 & 60011 & 0110 = 00103&6=2

按位或运算符  |

0 | 0 = 0; 1 | 0 = 1; 1 | 1 = 1;3 | 60011 & 0110 = 01113 | 6 = 7

按位异或运算符  ^

0 ^ 0 = 0;1 ^ 0 = 1;1 ^ 1 = 0;3 ^ 60011 ^ 0110 = 1013 ^ 6 = 53^6^3 = 63^6^6 = 3

取反运算符  ~

~1 = 0; ~0 = 1;对一个二进制按位取反,即0变1,1变0

左移运算符  <<

1 << 20001 << 2 = 0100 = 4左移向右补0,每左移1位相当于改数乘以2

右移运算符  >>

4 >> 20100 >>2 = 0001 = 1右移向左补0,操作数每右移1位,相当于该数除以2-5 >> 2负数的二进制:先取正值的原码,再进行按位取反操作,再进行加1操作.(负数的补码就是负数的原码,并不考虑正数的原码反码补码都是其本身)0000,0101 ->1111,1010->1111,1011
得到负数补码后,负数左补1右边溢出位数将舍弃,将再补码减1,得到负数反码,再进行按位取反得到正数原码,正数原码再转成十进制,得到正数十进制数后,再向其取相反数.1111,1011 >> 2 = 1111,1110->1111,1110-1->1111,1101->0000,0010->2->(-2)

无符号右移运算符 >>>

-5>>>2无符号位右移 按照数值类型位长,进行向左补0,移出的右边位被丢弃11111111,11111111,11111111,11111011->00111111,11111111,11111111,1111111000111111,11111111,11111111,11111110=1073741822

没有无符号左移,因为左移至始至终是在右补0,不会产生符号问题;

也就是左移不能改变一个数的正负性质。

右移取决前面的符号位0或者1,右移正负数性质会产生补0或1的问题;

无符号右移因为向左补0,改变了符号位,则会将负数转换成正数性质。