本文是《凯哥陪你学系列之java基础篇》
感谢:
感谢网友:志远162。在上一篇中对错误指出。
在上篇中模运算正负号和分子保持一致而不是分母。希望大家记住
本篇主要内容:
1:比较运算
2:逻辑运算
3:位运算
4:三元运算
1: 比较运算:
比较运算符:等于,不等于,大于,大于等于,小于,小于等于。
在java中比较两个数等于使用的是双等号。比如 3==2
注意:比较运算符运算的结果是true或是false。
其中 instanceof这个先不用管。这个以后学习中需要的
2 逻辑运算符
Java中逻辑运算
逻辑运算符的作用:
用于连接两个boolean类型的表达式。
比如在数学中我们 2
但是 如果写出 x>2,x<5 这两个表达式和 2
所以就出现了逻辑运算符。
那么用java表达 x>2 其 x<5怎么表达?
(x>2 & x<5)这样就OK了。
代码演示:
class LogicDemo{
public static void main (String [] args){
int a = 3;
int b = 6;
System.out.println(a>2&a<5);
System.out.println(b>2&b<5);
}
}
运行结果:
分析原因:
System.out.println(a>2&a<5);为什么是true?
因为: a=3.而3>2.&符号左边是true 。又因为 3<5 .&符号右边是true.
所以&符号左右两边都是true。所以就是true.
System.out.println(b>2&b<5);为什么是false?
因为: b=6.而6>2.&符号左边是true 。而右边 6<5是false.
所以&符号左右两边就是 true和false。而输出的是false.
所以我们可以总结出&符号的特点
总结与(&):
&:与 或是叫 且。而且的意思
总结与(&):
&:与 或是叫 且。而且的意思
文字表达:
true & true = true;
true & false = false;
false & true = false;
false & false = false;
规律:
&符号:两边只要有一边是false结果必为false.
只有两边都是true,结果才是true。
总结与(|)
l:与、或者。就是或者的意思
文字表达:
true & true = true;
true & false = true;
false & true = true;
false & false = true;
规律:
|符号:两边只要有一边是true结果必为tr.ue
只有两边都是false,结果才是false。
与和或使用场景
当要取中间值或是数据(也就是区间值)的时候使用 & 。
比如 想要3 和4 那么就是 2
当要取不是区间值,使用或
比如 想要不是 3和4 那么就是 x<2 | x>5。取小于2或者是大于5的数
总结异或(^)
异或:
true & true = false;
true & false = true;
false & true = true;
false & false = true;
^和|的区别:
或是 两边都是真的时候结果依然为真
但是异或,两边都是真的时候 结果却为false.
总结非运算(!)
非运算取相反的值。
!ture = false;
!false = true;
短路逻辑运算:(面试题)
&& 双与其特点和单个&特点相同的。
但是只要有一边为假就不比较另一边了。
比如:int i = 1;
i>2 && i<5;
这个运算过程就是,先比较 1>2 结果是false.当使用&& 的时候就不在比较右边了。
但是如果使用& 还需要比较右边。所以&& 起到短路效果。
|| 和 |的效果是一样。但是||起到短路效果的。
为什么会出现 &&或是是||?
因为这个从效率上来讲比单&效率高。
&&和&区别:
&& 只能做逻辑运算符,起到短路效果。
& 不仅是逻辑运算符还是位运算符。
&:无论左边结果是什么,右边都参与运算。
&&:当左边是false时候,右边就不参与运算了。
||和|
|:无论左边结果是什么,右边都参与运算
||:如果左边是真,右边不参与运算。
|:还是位运算的
位运算符
Java中位运算符:
与运算:
6&3.
因为位运算直接对应的是二进制。
而我们知道6和3是int类型。而int类型在内存中是4个字节。32位二进制。
所以,6&3在内存中:
简写:
分析为什么 6&3 结果是十进制的2
0:false
1:true
而我们有知道&运算的特点。只要有一个为false结果必为false.
所以运算的结果就是二进制的010 对应的十进制就是2
同理 6|3 = 7
异或运算:
根据异或特点:两边相同即为假,两边不同才为真。
所以 6^3 = 5
6^3^3=6
所以,异或特点:
当一个数异或两一个数两次后,结果还是这个数本身。
异或作用:
作为加密的一种方式。
比如数字6 先用3异或一次后得到新的二进制。然后在网络上传输。等接受方拿到异或后的新二进制在和3进行异或后,就得到原来的数据6了。
反码:
其实就是取反后的二进制码
6的反码(~6): 是-7
理解:
反码就是取反后在加1.
左移:
3>>2:含义 3左移两位:
在内存中处理过程:
3在内存中完整的表示方式:
说明:两边的||表示在内存中临界边。
左移两位
得到新的二进制就是1100 转成十进制就是12
那么3<<3 = 24
分析原因:
因为这里操作的是二进制。所以左移一位就是2的1次方。左移3位就是2(3)
所以 :
总结:
左移N位其实就是该数乘以2的N次幂
所以 <
右移:
6>>1 =
6在内存中二进制:
右移一位:
右移一位后,最高位就空出一位。注意这里不能直接用0补。
如果是整数,使用0补,如果是负数使用1补。
也就是:原数据最高位是什么,右移后,最高位和原数据最高位相同。
对应二进制变成110对应的十进制就是3.
6>>2=1
找规律:
右移N位,其实就是该数除以2的N次幂
无符号右移:>>>
无符号右移与右移区别:
无符号右移,无论原数据最高位是什么,右移完成后最高位都用0补。
注意:
左移和右移,都操作的是二进制数据。
位运算练习:
练习1:
最优效率的方式算出2乘以8等于几?
内存中运算过程
分析得到 8=2(3).8等于2的3次方
所以 2*8 = 2*2(3)
2在内存中二进制表现:
2(3):2的3次方其实就是2左移3位。即时:2<<3
2的二进制左移三位后:
后面不够用0补全。
结果
有效的就是10000对应的十进制就是16。
所以代码:
练习2:
对两个整数变量的值进行互换(注意:不需要第三方变量)
分析:
正常的,使用第三方变量互换原理。
题目明确不能使用第三方变量。
方式1:
int a = 3,b = 5;
分析:
a = a+b; //此时a = 8
b = a-b;//此时b = 8-5 = 3
a = a – b;//因为在上一步 b = 3 所以此时 a = 8-3 = 5.
这样输出的 a = 5,b=3.a 和 b就互换了。
虽然使用这种方式也可实现a与b的互换。但是如果a和b都比较大
那么 a+b就有可能超出int范围。这样就会出现类型强制转换或是精度丢失的错误。
方案二:
使用异或运算。
从上面讲解我们知道 一个数异或另一个数两次之后,结果还是这个数的本身。
所以:
分析原因:
a = a^b; //这个没什么说的 此时a = a^b了
b = a^b; //这个时候因为上一步 a= a^b了。此时 b = ((a^b)^b)。其实 b = a
a = a^b; //有第一步 a = a^b ,有第二步 b = a。所以此时 a =( (a^b)^a).其实就是 a =b
将a b数据带入:
三元运算符
三元运算符(三目运算):三个元素参与运算的符号。
代码:
练习:
需求:比较两个整数,输出其中交大的
代码:
/**
三元运算符练习:
需求:
比较两个整数,输出其中交大的
**/
class OperatTest{
public static void main (String [] args){
int a = 5;
int b = 3;
System.out.println("a,b中较大的值为:"+ (a>b?a:b));
}
}
输出结果为:
练习二:
需求:求三个整数中较大的。
代码(部分):
//求三个整数中较大的。
int o =3,p =6,q = 1;
int temp = (o>p?o:p);
int max = temp>q?temp:q;
System.out.println("三个数中较大的值为:"+ max);