1.算术运算符
算术运算符的注意事项:
(1)对于+运算符
- 加法
- 正数
- 字符串拼接
- 操作数1 + 操作数2 两个操作数中,只要至少有一个是字符串,+操作执行的就是字符串拼接
System.out.println("hello" + 'a' + 1); // helloa1
System.out.println('a' + 1 + "hello"); // 98hello
System.out.println("5+5="+5+5); //5+5=55
System.out.println(5+5+"=5+5");//10=5+5
(2)对于/运算符
整数相除只能得到整数
//隐式类型转化
double e = 1.0 * a / b;
System.out.println(e);
(3)%
(4)++和–
(++或–)单独使用效果, 若参与运算,位置不同,效果不同
2.赋值运算符
符号:= , +=, -=, *=, /=, %=,其中=为基本的赋值运算符,其他的为扩展的赋值运算符
3.比较(关系)运算符
关系运算符的结果只有两种true or false
注意和“=”区分不要把“==”写成“=”
4.逻辑运算符
注意事项:
关于数值范围的描述的表达,比如 1 < a < 10
单“&”与双“&&”的区别(短路)
异或(^) VS 或(|)运算符
5.位运算符
* 位运算符: 针对变量的二进制位来进行运算
* 移位运算:
* a.左移运算符: 3 << 2 = 3 * 2 * 2 = 12
* 左移一位相当于给操作数 * 2(左移之后的结果仍然在,相应数据类型的表示范围之内)
* 00000000,00000000,00000000,00000011
* 移动一位
* 0000000,00000000,00000000,000000110
* 在移动一位
* 000000,00000000,00000000,0000001100 -> 12
*
* b.带符号的移位: -2 >> 1 , 相当于给操作数除以2(只针对,未溢出切,可以被除尽)
* 10000000,00000000,00000000,00000010 -> 补码 11111111,11111111,11111111,11111101
* + 1
* 11111111,11111111,11111111,11111110
* 对于带符号位的右移运算而言:右移运算,高位补符号位
* 111111111,11111111,11111111,1111111 -> 10000000,00000000,00000000,00000000
* +1
*
* 10000000,00000000,00000000,00000001 -1
* 不能除尽的情况
* 000000000,00000000,00000000,00000011 -> 0000000000,00000000,00000000,0000001
*
*
* c. 无符号右移:移位的动作和带符号数一模一样的,右移之后,高位直接填充0,
* 无符号右移,同常用来处理正整数,对正整数而言,无符号右移一位相当于除以2
*
* &: 只针对二进制的一位 0或者1,只有两个二进制都为1的时候结果为1,其余全为0
* 0 & 1 = 0 0 & 0 = 0 1 & 0 = 0 1 & 1 = 1
*
* |: 只有两位全为0的时候结果才为0
* 0 | 1 = 1 0 | 0 = 0 1 | 0 = 1 1 | 1 = 1
*
* ^: 相同为0,不同为1
* 0 ^ 1 = 1 0 ^ 0 = 0 1 ^ 0 = 1 1 ^ 1 = 0
* 性质:
* 1. 一个数和它自己异或运算的结果:a ^ a = 0
* 2. 0和任何数做异或运算:0 ^ a = a
*
* ~: 按位取反(包括符号位)
* ~6 = -7
* 00000000,00000000,00000000,00000110
* 11111111 11111111 11111111 11111001 -> 10000000,00000000,00000000,00000110
* +1
* 10000000,00000000,00000000,00000111
*
*/
//举例数据溢出 正整数 + 1 -> 负数
// 0111 1111,1111 1111,1111 1111,1111 1111
// +1
// 1000 0000 0000 0000 0000 0000 0000 0000
int a = 0x7fffffff; //int类型所能表示的最大正整数
System.out.println(a + 1);
//1000 0000,0000 0000,0000 0000,0000 0000
a = 0x80000000;
System.out.println(a);
//验证左移 <<
a = 3;
int b = 2;
a = a << 2; //如果要将让操作数变成移位之后的结果,必须要赋值才行
System.out.println(a << 2);
//验证带符号右移 >>
a = -1; //1,xxxxxxxxx, 111111111,111111111,11111111,1111111
System.out.println(a >> 2);
//无符号右移 >>>
a = -2;
// 11111111,11111111,11111111,11111110 -> 无符号右移1位 011111111,11111111,11111111,1111111
//System.out.println(a >>> 1); //2147483647
//验证一下异或运算的性质
a = 90; //异或运算满足交换律
System.out.println(a ^ a); //性质1
System.out.println(a ^ 0); //性质2
System.out.println(~6);
6.三目运算符
// 3数取大
int c = 100;
//两数取大,第三个数和两数中的大者比较,取它们的大者就是最大值
int tmp = a > b ? a : b;
int result = tmp > c ? tmp : c;
System.out.println("最大的是: " + result);
//三目运算的,3数取大的嵌套形式
//int tmp = a > b ? a : b;
//int result = tmp > c ? tmp : c;
result = (a > b ? a : b) > c ? (a > b ? a : b) : c;
System.out.println("最大的是: " + result);
7. 键盘录入数据
键盘录入数据
我们目前在写程序的时候,数据值都是固定的,但是实际开发中,数据值肯定是变化的,所以,我准备把数据改进为键盘录入,提高程序的灵活性。
如何实现键盘录入数据呢?(目前先记住使用)
导包语句(放到class定义的上面):
import java.util.Scanner;
创建对象
Scanner sc = new Scanner(System.in);
从键盘输入读取数据
int x = sc.nextInt();//录入整数
//读取字符串
//String s = sc.nextLine(); // “hello” String
boolean b = sc.nextBoolean(); //它们都默认以空格分隔不同的输入
String s = sc.nextLine(); //以回车作为数据的分隔符
//用完之后记得关闭
sc.close();
8. 相关题目
-
根据键盘录入的数值1,2,3,…7输出对应的星期一,星期二,星期三…星期日。
(用switch语句实现,代码+运行结果截图)
-
字长为8,已知原码 0110 1010 和 1100 0110, 求它们的补码
已知补码 0110 1010 和 1100 0110, 求它们的原码 -
语句byte b = 300;编译能通过吗?如果不能,怎样让它通过?转
换之后其值是多少?
3,有三个int变量,a, b, c假设三个变量中有两个变量的值相同,请问如何快速求出,那个和其他两个变量不同的第三个变量的值?(代码+截图)(提示:自己和自己异或为0,任何数和0异或的结果是自己)
- 任给一个int类型的正整数,如何判断该整数的值,是否是2的整数次幂?(代码+截图)
(提示:任何是2整数次幂的十进制数的二进制有效位都只有一个1)
5.利用switch语句,实现对学生分数评级的功能。
程序的输入是一个int类型的变量score,代表学生的分数取值范围[0,100]
当分数范围为 0=< score <60 输出 不及格
当分数范围为 60=< score <70 输出 及格
当分数范围为 70=< score <80 输出 中
当分数范围为 80=< score <90 输出 良
当分数范围为 90=< score <=100 输出 优
提示:可合理利用case穿越
提交代码+运行结果截图哈
6,判断一个5位数是否是回文数(比如12321)
个位等于万位
十位等于千位
提交代码+运行结果截图