Day7 运算时脑子有点烧
Day7 运算时脑子有点烧2.0
本节课关于运算符进行了一些补充,主要有三块内容
自增与自减
我们先来看一段代码
public class Demo04 {
public static void main(String[] args) {
//自增++、自减--,一元运算符,非常重要!
int a = 3;
int b = a++;
//隐藏了一行代码,即a=a+1,执行完这行代码后,a会+1,它是先给b赋值,再自增,所以b还是3,但是之后a变成4
System.out.println(a);
int c = ++a;
//隐藏了一行代码:a=a+1,但是由于++在前,所以是先自增从4变成5,再给c赋值,
//所以这里c会变成5,而此时在经过两次自增后,a也已经变成了5
System.out.println(a);//
System.out.println(b);
System.out.println(c);
//同理a--和--a
//幂运算 (很多运算会使用工具类来操作)
double pow = Math.pow(3, 2);
System.out.println(pow);
}
}
其结果为
什么意思呢?自增自减的意思(++、--)非常简单,就是在自身的基础上加1,比如原先a=3,在自增后a=4,但是这个自增的时间点是有差别的,比如a++(++在后面)会在整个式子执行后,为a加上1,这个情况下如果进行赋值,则赋值会发生在自增之前,即b=a++,若这个式子被执行,b就会先被赋值,此时b=3,执行后a会自增,此时a=4;
如果是++a(++在前)那么此时执行后自增会发生在赋值之前,c=++a,a会先自增,此时a=5,再赋值给c,此时c=5。
同时还介绍了关于幂运算的知识,这里的幂运算是借助Math的数学工具类来进行的,可以理解为在编程里设定好计算器,其背后也有一套源码,这里暂不深究。
逻辑运算
此部分介绍了逻辑运算符的相关内容,在boolean值的基础上,我们先看一段代码
package operator;
//逻辑运算符
public class Demo5 {
public static void main(String[] args) {
//与(and) 或(or) 非(非你即我)
boolean a = true;
boolean b = false;
System.out.println("a && b:"+(a&&b));//逻辑“与”,两个变量都为true,则结果为true,通过加号与字符串结合起来
System.out.println("a || b:"+(a||b));//逻辑“或”,两个变量一个为true,则两个都为true,同时两个都为false,结果才为false
System.out.println("!(a && b):"+!(a&&b));//“非”(取反),如果是真则为假,如果是假则为真
//短路运算
int c = 5;
boolean d = (c<4)&&(c++>4);
System.out.println(d);
System.out.println(c);
//1.由于在这个式子里,c<4一定是false在前,所以逻辑运算中,前一个为假
//则这个逻辑与运算一定为假,它会直接跳过“与”后面的变量直接判断假
//所以这里c++的自增根本没有被执行,而是被跳过了。这就是短路运算。
}
}
这里介绍了三种逻辑运算符:&&、||、!
分别为:“与”(and)、“或”(or)、“非”(取反)
上面这段代码的运算结果为:
在这里,a为真,b为假
&&是只有两者都为真,结果才为真
||是两者都为假,结果才为假,也即只要一项为真,那结果就为真
!取反后自然就是原先结果为假,那么取反结果为真
- ps,这里还介绍了所谓的短路运算,在进行逻辑运算的时候是依序进行的,例如在&&中,若比对的前一项为假,那么就无需比对,直接为假,会略过执行后一项,这里的后一项是c++,在执行后c会自增,本应c=5+1=6,但很显然c完全没有经过自增依然为5,可以得知此项没有被执行,这就是短路运算。
位运算(面试题)
这里还介绍了一下面试可能会遇到的位运算题目,我们来看代码:
package operator;
public class Demo06 {
public static void main(String[] args) {
/*
位运算(面试题)
A = 0011 1100
B = 0000 1101
A&B = 0000 1100(两个都是1,才能使1)
A|B = 0011 1101(两个都是0,才能为0,否则都是1)
A^B = 0011 0001 (两个相同才为0,否则为1)
~B = 1111 0010(就是简单的取反,原来为1则现在为0)
2x8 = 16 2*2*2*2
<< >>左移和右移
*/
System.out.println(2<<3);
/*
左移和右移的逻辑其实是二进制的位数计算
比如0是0000 0000
1是0000 0001
那么2是0000 0010
以此类推8是 0000 1000
而十六就是 0001 0000
其实就是将1的位置左移了3位,所以直接就得出结果了
所以其实<<就是*2,而>>就是/2
*/
}
}
位运算由于借助2进制,其本质上也变成了某种程度上的逻辑运算,依靠比对来进行:
&的含义是两者都为1,结果才为1
|的含义是两者都为0,结果才为0
^的含义是两者要相同才能为0,否则为1
~就是单纯的取反,原先是0现在是1,反之亦然
在这里会有一类考题,如何快速运算2的倍数运算?
如2*8=16如何实现,依靠位运算非常简单
如1在二进制是0000 0001
而2在二进制是0000 0010
而4在二进制是0000 0100
可以看出*2即为1的位置向左移一位,而/2则为1的位置向右移一位
这两个计算正好对应着<<(左移)和>>(右移)两个运算符,可以非常方便地利用底层二进制逻辑计算类似的内容。
这里的2<<3其实就是2 * 2 * 2,在二进制层面上就是1的位置左移三位,挺好玩的。