java中的运算符(详解)

1.11 运算符

1.11.1 [+、-、/、*、%]

[+]当+遇到String类型的时候 不再表示算数加法 而是表示追加连接

[-]算数减法

[*]当心数值超出int类型最大边界 注意使用long类型
一年的毫秒数:System.out.println(365L * 24 * 60 * 60 * 1000);

[/]整数除法取整:整数 / 整数 = 整数,小数除法可以按照常规输出

[%]取模运算符,求余数,最终结果的符号取决于位于参与运算的第一个数字的符号

System.out.println(5/0);//算数异常
System.out.println(5/2);//2
System.out.println(5/2.0);//2.5
System.out.println(5/0.0);//infinity-》无穷大
System.out.println(0.0/0.0);//Nan-》not a number-》不是一个数字
System.out.println(5%2);//取余数1
System.out.println(-5%2);//取余数-1
System.out.println(5%-2);//取余数1
System.out.println(-5%-2);//取余数-1
1.11.2 [+=、-=、*=、/=、%=]

他们能够保证运算符的左边的数据类型不发生改变 -》隐式强转

int x=45;
x += 5.5;//隐式强转:double转int
System.out.println(-5%-2);//取余数-1
1.11.3 [++、–]自增自减运算符

【a.取值 b.运算 ++x:ba x++:ab】

int x =10;
int y =x++ +2;
System.out.println(x);//11
System.out.println(y);//12
int x = 45;
//x++: 先取值45  运算 x=46
//++x:先运算 x=47  取值 x=47
//x++: 先取值47  运算 x=48
x = x++[45] + ++x[47] + x++[47];//139
//x++:先取值 139  运算  x=140
System.out.println(x++);//139
System.out.println(x);//140
1.11.4 > < <= >= ! != ==

【> < >= <= 】返回的都是boolean类型 -》 true/false

【!】非 !boolean
!true = false !false = true

【!=】判断左右两边的值是否不相等
System.out.println(45 != 45);//false

=和==之间的区别?
=:赋值运算符 将右侧的值交给左边的变量保管
int x = 45;

​ ==:判断左右两边的值是否相等

​ System.out.println(45 == 45);//true

1.11.5 [&& || & |] 逻辑运算符

&&与&之间的区别?

相同点:&&和&都是逻辑与,需要前后两个条件都成立才能执行

不同点:&&逻辑的短路与,有短路特性

短路特性:如果通过前面的条件可以得出最终结论,后面的条件不再判断,直接舍弃

public class Exec7{
  public static void main(String[] args){
    Teacher t = new Teacher();
    t.name="王";
    t.age=51;
    t.gender='女';
    t.salary=3000;
    t.show();


  }
}
class Teacher{
  String name;
  int age;
  char gender;
  double salary;
  public void show(){
     if(age>50&&gender=='女'){
       salary += 1000;
    }
    System.out.println(name+"老师,"+"今年"+age+"岁,"+"工资是"+salary);
  }
}

||和|的区别?

相同点:||和|都是逻辑或,需要其中一个条件成立就能执行

不同点:||逻辑的短路或,有短路特性

如果通过前面的条件可以得出最终结论,后面的条件不再判断,直接舍弃

1.11.6 [& | ^ ~]按位(二进制)运算符

& :按位的与, 要求上下二进制都是1的时候才能写1 [逢0写0]

System.out.println(9 & 5);//1
9:8+1 = 000…1001
5:4+1 = 000…0101 &
000…0001

|:按位的或,要求上下只要有1就写1 [逢1写1]

System.out.println(9 | 5);//13
9:8+1 = 000…1001
5:4+1 = 000…0101 |
000…1101 : 8+4+1=13

^: 按位的异或,要求上下二进制不一样写1,一样的写0

System.out.println(9 ^ 5);//12
9:8+1 = 000…1001
5:4+1 = 000…0101 ^
000…1100 : 8 + 4 = 12

~: 按位取反,0-》1 1-》0

byte x = 9;
~x;
9:8+1 = 000…1001
~9 111…0110
111…1111 : -1-1-8=-10

重点

&:在某些情况下取代%
某些情况:
当我们拿着一个正数 % 2的n次方数的时候
结果等价于
我们拿着这个正数 & 2的n次方数-1的结果

//&的方法
if((x & 1) == 0){
	 System.out.println("偶数");
	}else{
		System.out.println("奇数");
}
//%的方法
 if(x%2==0){
   System.out.println("偶数");
	}else{
		System.out.println("奇数");
 } 

^:可以不借助第三块空间的方式交换两个变量的值

	int x = 45;
	int y = 90;
  //创建第三方
		int z = x;
		x = y;
		y = z;
//不创建第三方
int x = 45;
int y = 30;
x = x ^ y;
y = x ^ y;
x = x ^ y;

原理:

public class TestOperation9{
	public static void main(String[] args){

		int x = 45;
		int y = 30;

		//交换两个变量的值

		x = x ^ y;
		y = x ^ y;
		x = x ^ y;

		/**
			int x = 45;
				45 = 32 + 8 + 4 + 1 = 000..101101
			int y = 30;
				30 = 16 + 8 + 4 + 2 = 000..011110

			x = x ^ y;
				000..101101
				000..011110 ^
				000..110011 : 32+16+2+1 = 51 -> x

			y = x ^ y;
				000..110011
				000..011110 ^
				000..101101 : 32 + 8 + 4 + 1 = 45 -> y
				
			x = x ^ y;
				000..110011
				000..101101 ^
				000..011110 : 16 + 8 + 4 + 2 = 30 -> x
		*/
		//int z = x;//z = 45
		//x = y;//x = 30
		//y = z;//y = 45
		System.out.println(x + "	" + y);
	}
}
1.11.7 [<< >> >>> ] 位【二进制】移运算符
*2   *4  *8    *16……*2^n
<<1   <<2  <<3  <<4……<<n(效率高)
  
/2   /4  /8    /16……/2^n
>>1  >>2 >>3   >>4……>>n
byte x = 9;
x<<1;
System.out.println(x);//18

(>>)和(>>>)区别?

(>>)有符号右移,移动之后空缺的高位除符号位用0替代

(>>>)无符号右移,移动之后空缺的高位直接用0替代

1.11.8 [?:]三元运算符,三目运算符

【条件 ? 第二部分:第三部分】

条件永远是boolean类型

成立true:执行第二部分 不成立false:执行第三部分

System.out.println(45>55?45:55);
//二三部分类型统一后才能做运算
System.out.println(45>55?45.0:55);//55.0
//如果数字在char类型的取值范围【0-65535内,此时的数字为ascii码 打印出出来的结果是ascii码对应的字符
System.out.println(45>55?'a':98);//b
//如果数字不在【0-65535内,此时char类型转为int类型,即ascii码,打印出来的结果是对应字符的ASCII码
System.out.println(45<55? 'a':-98);//97

一等优先级:[±*/%],[++,–],[> < >= <= ! = != ==],[&& || & |]

二等优先级:[+= -= *= /= %= ],[& ^ | ~]

​ &取代%:x%2(n)次方= x&2(n)次方-1

​ ^只能交换的数据类型:byte char short int long boolean

​ [<< >>] <<取代(乘号): x*2(n) ==x<<n (>>)取代(除号):x/2(n)==x>>n

​ [?:]取代 if else if条件 ? if条件成立执行语句:else成立执行语句

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值