java从小白到老白③
PS:①小陌笔记中蓝色紫色等一切花哨字体皆用来引入知识点(废话流),可忽略不计 。
②黑字正文小陌竭力向言简意赅靠近再靠近。
③红色字体小陌觉得重要的地方
- 老规矩,题目引入:
int a = 1;
int b = 2;
System.out.println(++a == 1 && ++b == 2);
System.out.println(a);
System.out.println(b);
int x = 1;
int y = 2;
System.out.println(++x == 1 & ++y == 2);
System.out.println(x);
System.out.println(y);
以上代码有何不同?
这还不简单,第二段漏了个&对不对!
让我们先看输出结果:
①false
2
2
②false
2
3
对照结果会发现,&&操作中没有接着执行后面的判断,直接判定为false
虽然&与&&的最终结果一样,但是&&具有短路功能,左边一方为false,直接判为false,不再执行右边。
而|与||同理,因为&&与||的相对高效率,所以我们常用的逻辑运算符是&&和||这俩成双成对的,而不是那种光棍吧唧的死脑筋~
好叭,需要承认,小陌这种单身猿,之所以单身,像&和|不被多用一样,应该也是有理由的
-
位运算
-
^异或,同则1,不同则0
-
~按位取反,1变0,0变1
①一个数据对另一个数据位异或^两次,该数本身不变
<<左移运算符 左边最高位丢弃,右边补齐0
>>有符号位右移运算符 最高位是0,左边补0;最高位是1,左边补齐1
>>>无符号位右移运算符 不管最高位0还是1,左边补齐0
eg1:3<<2 等价于 3*2^2
8>>2 等价于 8/2^2
但是对于>>与>>>往往需要严格按照位运算进行
eg2: -10的右移操作
System.out.println(-10>>>3);//536870910
System.out.println(-10>>3);//-2
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110
>> 11111111111 11111111 11111111 11110(110)补码
11111111111 11111111 11111111 11101反码
10000000000 00000000 00000000 00010原码
System.out.println(-10>>3);//-2
>>> 00011111111 11111111 11111111 11110(110)原码//注意哦( • ̀ω•́ )✧原码既然是正数,则原反补相同
System.out.println(Integer.parseInt("11111111111111111111111111110", 2));//536870910
(既然是位运算,记得把数据转化为二进制再进行相应运算,注意操作的是补码,如果是负数记得还原为原码)