这学期学过Java了,但是感觉学的不太踏实,虽然考试也结束了但还是想要把这门语言学扎实!
这周快学到了面向对象,感觉需要再复盘掌握的有:
逻辑运算符和位运算符、转义字符、流程控制语句、数组的运行原理(引用数据)
先复盘一下逻辑运算符和位运算符吧!!
什么叫做位运算符、逻辑运算符
位运算符和逻辑运算符有哪些?它们的运算规则是什么?
位运算符的运算逻辑(正数和正数运算、正数和负数进行运算)
第一:要明确什么是逻辑运算符,什么是位运算符:
逻辑运算符:逻辑运算符的两边比较的是布尔类型的数值,自然返回的也是布尔数值
比如:12>3&&3<4; (这样子返回的结果就是布尔数值)
实现代码:(非常想炫耀一下自己胡乱找的字体但是很漂亮嘿嘿嘿嘿嘿(雾))
![](https://img-blog.csdnimg.cn/img_convert/a0fb6ccbfd2f055bd37f0fc70e7b8f9b.png)
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/e5233eb97db5e22e8598bd97d91a2140.png)
位运算符:两边比较的是数值类型(基本数值类型byte、short、int、long等等),同样返回的结果也是一个数值
比如:5&3
运行代码:
![](https://img-blog.csdnimg.cn/img_convert/c266b2ae32e50183651ad27b85ac69ad.png)
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/5debfa67627b8231ae2f592a284e5dad.png)
总结:逻辑运算符比较的是布尔值(true、false),而位运算符比较的是数值(数字)
第二:逻辑运算符和位运算符有哪些?
逻辑运算符:
逻辑运算符 | 含义 | 运算规则 | |||||
& | 逻辑与 | 两个操作数都为true,返回的结果为true;如果其中有一个为false,那么结果返回false | |||||
| | 逻辑或 | 两个操作数中只要有一个为true,返回的结果就是true;如果两个操作数都为false,则返回false | |||||
^ | 逻辑异或 | 两个操作数的结果相同,则返回false;两个操作数的结果不同,则返回true | |||||
! | 逻辑反(逻辑非) | 操作数为false,结果为true;操作数为true,结果为false | |||||
&& | 短路与 | 当两个操作数的结果都是true的时候返回true;当两个操作数的结果不全为true的时候返回false(跟逻辑与的运算规则一样) | |||||
|| | 短路非 | 当两个操作数中有一个为true,那么结果返回true |
举例代码为:
![](https://img-blog.csdnimg.cn/img_convert/54cbdf21d2a56211cffb17c637848e61.png)
运行结果为:
![](https://img-blog.csdnimg.cn/img_convert/2c086cca963c2676191aad55f66e8d6e.png)
位运算符:
位运算符 | 含义 | 运算规则 | |||||
& | 按位与 | 两个数都为1,结果才是1 | |||||
| | 按位或 | 两个数只要有一个为1,那么结果输出为1 | |||||
^ | 按位异或 | 两个操作数相同,返回0;两个数不同,结果返回1 | |||||
~ | 按位非 | 操作数为1,结果为0;操作数为0,结果为1 | |||||
<< | 左移运算符 | 将操作数左移之后,右边的空白处补0(也就是扩大2的n几次方倍,n取决于左移的个数) | |||||
>> | 右移运算符 | 将操作数右移之后,左侧的空白处补上0(也就是缩小2的n次方倍,n取决于左移的个数) | |||||
>>> | 无符号右移运算符 | 将操作数右移之后,左侧的空白补上o(与右移运算符号不一样) |
值得注意的是:右移运算和和无符号右移运算符虽然规则看起来差不多,但是实际操作起来却不一样:
两者的区别在于:右移运算符,当数字为负数的时候,在最高位上补1;当操作数为正数的时候,在最高位上补0
无符号右移运算符:不管操作数为正负数,都会在最高位上补0,保证输出来的结果是一个正数
第三,位运算符运算逻辑
首先需要明确三个概念:
源码:一个数的二进制的形式就叫做源码
反码:将一个数字的二进制,除了符号位之外全部取反,1变成0,0变成1,这个叫做取反
补码:将一个数字的反码+1得到反码
计算机运行的都是补码,所以我们要进行运算的话就需要得到这两个参与运算数字的补码,然后在进行相对应的运算;需要注意的是:正数的源码、反码、补码都是一样的,所以正数只需要知道其中一个(源码、反码、补码)就可以进行运算了(我非常容易在这里出错TAT);但是负数不能这样,负数就需要知道它的源码、反码、补码,然然后再进行相关的运算
正数的符号位是:0 负数的最高位是:1
举个栗子:
2&5
运行代码为:
![](https://img-blog.csdnimg.cn/img_convert/13eeae3c051e958755da16c2bd0eac30.png)
运行结果为:
![](https://img-blog.csdnimg.cn/img_convert/d0e4bd02756910f541d1dc6ec5dc663e.png)
-4|5
运行代码为:
![](https://img-blog.csdnimg.cn/img_convert/3d1db96d15451210263fb97afbe5dd3d.png)
运行结果为:
![](https://img-blog.csdnimg.cn/img_convert/4d3a4d3998a9e803fef5c47d6961773e.png)
总结:当正数和正数进行运算的时候不需要把他们的反码和补码都求出来;但是在进行正数和负数的运算,或者是负数和负数的运算,只要有负数的,都要求出来负数的反码和补码;进行完运算之后不要着急,只要跟负数有运算的都要在从补码、反码(减1)、源码(取反)的顺序得到结果的源码