本文是《凯哥陪你学系列之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);