1.逻辑运算符
1.1逻辑运算符的基本用法
逻辑运算符的种类:
种类 | 用法 |
---|---|
&(并且) | 运算两端同时为true最终结果才为true |
|(或者) | 运算两端同时为false最终结果才为false |
!(非) | 运算的结果取相反值,原来为true,运算完为false;原来为false,运算完为true |
^ (异或) | 相同为false,不同为true |
&&(短路与) | 和 &(并且)最终的运算结果上,是没有区别的,只是在运算效率上有区别 |
||(短路或) | 和 |(或者)最终的运算结果上,是没有区别的,只是在运算效率上有区别 |
逻辑运算符一般用于连接boolean类型的表达式或者值。
注意:
在Java中我们要表示一个数大于3并且小于6 ,不可以写成3<x<6,应该写成 x>3 & x<6 。
除此之外还要注意一点,当我们表示一个变量的倍数是,比如x的三倍,不应该写成3x,二十应该写成3*x。
1.2&和&&的区别
它们在最终的运算结果上,是没有区别的,只是在运算效率上有区别。
&运算两端的表达式都会执行;
&&当左端的表达式为false时,右端的表达式就不执行了。只有当左边的表达式为true时,才运算右边的表达式。
因为当左端的值为false时,可以决定整体这个表达式的最终结果。而左端的值位true时不能决定最终结果。
如下面的程序:
class Test{
public static void main(String[] args) {
int a=10;
int b=20;
boolean f=a>b&a++>11;
System.out.println("f:"+f);
System.out.println("a:"+a);
}
}
观察这段程序,当使用&将 f=a>b和a++>11两个表达式连接起来的时候, f=a>b的值是false,就可以判断这个语句用&连接起来的结果也是false,但是它仍然执行了后面的a++>11。看下面的结果:
但是继续看下面这段程序,仅仅把运算符从&换成了&&,结果便截然不同。
class Test{
public static void main(String[] args) {
int a=10;
int b=20;
boolean f=a>b&&a++>11;
System.out.println("f:"+f);
System.out.println("a:"+a);
}
}
运行的结果为:
这一次没有执行a++>11,因为当左端的值为false时,可以决定整体这个表达式的最终结果。所以就不需要执行右端的语句了。
1.3|和||的区别
|和||的区别和上面&和&&相似
它们在最终的运算结果上,是没有区别的,只是在运算效率上有区别。
|运算两端的表达式都会执行;
||当左端的表达式为true时,右端的表达式就不执行了。只有当左边的表达式为false时,才运算右边的表达式。
因为当左端的值为true时,可以决定整体这个表达式的最终结果。而左端的值位false时不能决定最终结果。
2.位运算符
2.1位运算符的种类
种类 | 作用 |
---|---|
&(与) | 有0则0 |
|(或) | 有1则1 |
^ (异或) | 相同则0,不同则1 |
~(按位取反) | 0变1,1变0,符号位也要取反 |
<<(左移) | 空位补0,被移除的高位丢弃 |
>>(右移) | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。 |
>>>(无符号右移) | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
举例:
1&2
0 0000001 补码
0 0000010 补码
——————————
0 0000000 补码
1|2
0 0000001 补码
0 0000010 补码
——————————
0 0000011 补码
~1
0 000 0001(此时是补码,按位取反)
1 111 1110(此时是补码,求原码)
1 000 0010 (原码)
从补码到原码符号位不变,所以我们看到1按位取反之后变成了-2.
重中之重:
切记:位运算是补码的运算,如果运算前如果是正数就可以直接运算,如果是负数,一定要换成补码,然后再进行运算。运算完结果仍是补码,我们要换成原码。如果结果是正数,结果就等于原码,如果是负数,就要将补码换成原码。
2.2位异或运算符的特点
(1)一个数被另一个数位异或两次该数不变。
a^b^b=a;
利用这个特点我们还可以进行值交换,下面我们会提及。
(2)自己和自己位异或结果是0。
a^a=0;
2.3左移、右移运算符的特点
<< : 把<<左边的数据乘以2的移动次幂 例如 10<<3 结果 10*2^3=80
>> : 把>>左边的数据除以2的移动次幂 例如 40>>3 结果 40/2^3=5
3.值交换的几种方式
方式1:采用中间变量进行值的交换
t=a;
a=b;
b=t;
方式2:采用位异或来进行值的交换(一个数被另一个数位异或两次该数不变)
a=a^b;
b=a^b; //b=a^b^b;
a=a^b;//a=a^b^a;
方式3:
a=a+b;
b=a-b;//b=a+b-b=a
a=a-b;//a=a+b-a=b
方式4:
a=(a+b)-(b=a);
4.三元运算符
格式:表达式?值1:值2;
当表达式的结果为true时,返回值1,为false时,返回值2;
比较三个数,输出最大的数;
class Test{
public static void main(String[] args) {
int a=20,b=10,c=100;
int max;
max=(a>b?a:b)>c?(a>b?a:b):c;
System.out.println(max);
}
}
三元运算符可以嵌套,但是要注意代码的阅读性,不建议嵌套,这样比较复杂。
5.键盘录入
(1)为什么要使用键盘录入数据
a:为了让程序的数据更符合开发的数据。
b:让程序更灵活一下。
(2)如何实现键盘录入呢?
a:导包
格式:
import java.util.Scanner;
位置:
在class上面。
b:创建键盘录入对象
格式:
Scanner sc = new Scanner(System.in);
c:通过对象获取数据
格式:
int x = sc.nextInt();