Java运算符和作用
这里我先说一下运算符和操作数:
运算符是表示运算的符号,参与运算的数据称为操作数。
算数运算符
1.一元运算符只有一个操作数(+、-、++、–四种)
如:+x表示x取正数,++x或x++表示x加1
2.二元运算符有2个操作数(+、-、*、/(除)、%(求余)五种)
如:p1+p2表示两数相加
关系运算符
有两个操作,数关系运算符(>、<、>=、<=、==、!=)是布尔类型,表达式的结果为true或false
如:p1>p2(p1=1,p2=3)结果为false
布尔逻辑运算符
1.逻辑与&&、逻辑或||是二元运算符(短路运算)
如:x>0&&y<4若x=-1,y=3,在逻辑与中,x>0不成立则整个表达式都不成立,结果为false,不用在判断y<4是否成立了。
x>0||y<4若x=2,y=5,在逻辑与中,x>0成立则整个表达式都成立,结果为true,不用在判断y<4是否成立了。
2.逻辑非!是一元运算符。
位运算符
位运算对二进制进行操作。
1.~按位取反,如:~11001010→00110101
2.&按位与,如:0&0=0,0&1=0,1&1=1
按位与可以用来屏蔽特定的位,对特定的位清零。 int theFourthBit=i&8; (8=00001000),在变量i的二进制中除了右边第四位没有变化以外,其余位全部被清零。
也可以用来取某个数中某些指定的位,如:取整数变量i的第五位,可以这样表示int theFifthBit=i&16 (16=00010000)。
3.|按位或,如:0|0=0,0|1=1,1|1=1
按位或和可以将某些位变为1,如:将整型变量i的第四位和第五位换成1,可以用语句(int setFourthAndFifthBit=i | 24; 来实现(24=00011000)
4.^按位异或,如:0^0=0,0^1=0,1^0=1,1^1=0
可以实现两个数的交换,而不使用临时变量,如:交换两个整数a ,b的值,可以用下列语句实现:
int a=15,b=24;//(15=00001111,24=00011000)
a=a^b;//a=23(00010111)
b=b^a;//b=15
a=a^b;//a=24
5.移位运算符(<<、>>、>>>)
这里要先了解补码的概念:Java使用补码来表示二进制数,在补码表中,最高位是符号位,正数用0表示,负数用1表示。
注意:如何得到一个负数的补码?这里我用-1来举例:把负数-1绝对值的补码(|-1|的补码及1的补码(00000001))按位取反(得到11111110),然后对整个数加1,就得到-1的补码11111111了。
>>算术右移,如:a=11001101,则a>>2=11110011 (移到右端的低位被舍去,最高位的值移入的还是原来高位的那个值)
右移一位相当于除以2取商,而且用右移实现除法比除法速度要快。
<<算数左移,如:a=00001111,则a<<2=00111100(右边补0)高位左移后溢出,舍弃不起作用。
在不产生溢出的情况下,左移1位相当于承2,左移实现乘法比乘法运算速度要快。
>>>逻辑右移(无符号右移)如:a=11010011,则b>>>2=00110100
赋值运算符
=复制运算涉及到类型的转换,如:
byte b=12;
int i=b;//byte自动转换为int类型
int a=22;
byte b=(byte) a;//int强制转换为byte类型
条件运算符
三元运算符? : 如:p1>p2?a:b; 若p1>p2成立,结果取a,不成立就取b。