2021年12月13日
赋值运算:
short s1 = 10;
s1 = s1 + 2;//编译失败
s1 += 2;//不改变变脸本身的数据类型
int m = 2;
int n = 3;
n *= m++;
System.out.println("m = " + m);//m是3
System.out.println("n = " + n);//n是6
int n1 = 10;
n1 += (n1++) + (++n1);//n1 = n1 + (n1++) + (++n1);//n1 = 10 + 10 +12;
System.out.println(n1);//32
逻辑运算:
- 异或:同为假、异为真
- a=true b=true a^b=false
- a=false b=false a^b=false
- a=true b=false a^b=true
- a=false b=true a^b=true
&与&&的区别:
- 相同点1:&与&&的运算结果结果相同;
- 相同点2:当符号左边是true时,二者都会执行符号右边的运算;
- 不同点:当符号左边是false时,&继续继续执行符号右边的运算,&&不再执行符号右边的运算;
- 开发中,推荐使用&&。 |与||的区别:
- 相同点1:|与||的运算结果结果相同;
- 相同点2:当符号左边是false时,二者都会执行符号右边的运算;
- 不同点:当符号左边是true时,|继续继续执行符号右边的运算,||不再执行符号右边的运算。
- 开发中,推荐使用||。 可以通过以下代码进行测试:
boolean b = true;//可以使用false或true替换
int num = 10;
if(b && (num++))//可以使用&&短路与或||短路或替换
{
System.out.println("do if phrase");
}
else
{
System.out.println("do else phrase");
}
System.out.printl(num);//用于观察是否执行了num++
2021年12月14日
二进制
- 14的原码:00001110(正数的原码、反码、补码都相同)
- -14的原码:10001110
- -14的反码:11110001
- -14的补码:11110010(反码+1,计算机中存储以补码形式存储所有整数)
位运算
- 1、位运算操作的都是整形数据
- 2、<<是在一定范围内,向左移1位,相当于 * 2。空位补0,被移除的高位丢弃。
- 3、>>是在一定范围内,向右移1位,相当于 / 2。被移位的最高位是0,右移空缺补0;被移除最高位是1,右移空缺补1。
- 4、>>>,被移位的最高位无论是0还是1,空缺都用0补。
- 5、&,只有1&1时结果是1,否则是0。
- 6、|,只有0|0时结果是0,否则是1。
- 7、^,相同二进制^运算结果是0,1^1=0,0^0=0;不同二进制^运算结果是1,1^0=1,0^1=1。 例如:
- m = 13;00001101
- n = 5 ;00000101
- m ^ n ;00001000=8
- 8 ^ n ;00001101=13,m = (m ^ n) ^ n
- 将两个变量的数据交换的三种方式:
int num1 = 10;
int num2 = 20;
//方法一:定义临时变量,经常使用的方法
int temp = num1;
num1 = num2;
num2 = temp;
//方法二:可能超出存储范围,只能适用于数值类型
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
//方法三:使用位运算
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
-
8、~,按补码取反。
-
面试题:最高效的方式计算 2 * 8? 2 << 3 或 8 << 1
-
下面是面试的一道题:答案是z=46
boolean x = true;
boolean y = false;//try y = true;
short z = 42;
if((z++ == 42) && (y = true))z++;//赋值为true表现为true,&&第一个为false短路
if((x = false) || (++z == 45))z++;//赋值为false表现为false,||第一个为true短路
System.out.println("z = " + z);
练习1,答案x = 2, y = 2
int x = 1;
int y = 1;
if(x++ == 2 & ++y == 2)
{
x = 7;
}
练习2,答案x = 2, y = 1
int x = 1;
int y = 1;
if(x++ == 2 && ++y == 2)
{
x = 7;
}
练习3,答案x = 7, y = 2
int x = 1;
int y = 1;
if(x++ == 1 | ++y == 1)
{
x = 7;
}
练习4,答案x = 7, y = 1
int x = 1;
int y = 1;
if(x++ == 1 || ++y == 1)
{
x = 7;
}
2021年12月15日
三元运算
- 三元表达式中,表达式1和表达式2要求一致。
- 三元运算可以嵌套使用。
- 凡是可以使用三元运算符的地方,都可以改为if-else,反之不行。
- 如果既可以使用三元运算又可以使用if-else,优先使用三元运算,原因简洁、高效 三个数比大小,例子:
int n1 = 10;
int n2 = 20;
int n3 = 30;
int max1 = (n1 > n2)? n1 : n2;
int max2 = (max1 > n3)? max1 : n3;
运算符优先级
- 只有单目运算符、三元运算符、赋值运算符是从右向左运算的。
- 单目运算符是指运算所需变量为一个的运算符,即在运算当中只有一个操作数,又叫一元运算符,其中有逻辑非运算符:!、按位取反运算符:~、自增自减运算符:++, --等。
2021年12月16日
运算符推荐使用
- 开发中实现+2操作的两种方法:
- num = num + 2;//不推荐使用
- num += 2;//推荐使用
- 开发中实现+1操作的两种方法:
- num = num + 1;//不推荐使用
- num += 1;//不推荐使用
- num++;//推荐使用
int i = 1;
i *= 0.1;//不改变i的数据类型
System.out.println(i);
i++;
System.out.println(i);
取模运算
- 结果的符号与被模数的符号相同。12%5=2;-12%5=-2;12%-5=2;-12%-5=-2
- 开发中,经常使用%来判断能否被除尽
整除 /
12/5应该等于2.4,为了得到这个结果尝实以下几种方法:
int m = 12;
int n = 5;
int result1 = m / 2;//2
int result2 = m / n * n;//10
double result3 = m / 2;//2.0
double result4 = m / n + 0.0;//2.0
double result5 = m / (m + 0.0);//2.4
double result6 = (double)m /n;//2.4
double result7 = (double)(m / n);//2.0
例题:如何求一个0~255范围内的整数的十六进制,例如60的十六进制表示形式3C
- 自动实现
String str1 = Integer.toBinaryString(60);//111100,Integer类
String str2 = Integer.toHexString(60);//3c
- 手动实现
int i1 = 60;
int i2 = i1 & 15;//位运算,去后四位,后四位是1100&1111,正好是1100,如果是取3位,就是和7&。
String j = (i2 > 9)?(char)(i2 - 10 + 'A') + "":i2 + "";//取出后四位看是否是大于9,因为10就要用A表示,
int temp = i1 >>> 4;//无符号位移,只有/2的时候才使用>>
i2 = temp & 15;
String k = (i2 > 9)?(char)(i2 - 10 + 'A') + "":i2 + "";
System.out.println(k+""+j);
2021年12月16日
scanner类
- 从键盘获取不同类型变量,使用scanner类。具体步骤如下:
- 导包:import java.util.Scanner;。
- Scanner的实例化:Scanner scan = new Scanner(System.in);。
- 调用Scanner类的相关方法,来获取指定类型的变量。
- 先显示文字,后收集数据。
import java.util.Scanner;//导报
class IfTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);//实例化
System.out.println("输入考试的成绩: ");//显示用户文字
int score = scan.nextInt();//收集数
if(score == 100)
{
System.out.println("奖励BMW");
}
else if(score > 80 && score <= 99)
{
System.out.println("奖励iphone");
}
else if(score >=60 && score <=80)
{
System.out.println("奖励ipad");
}
else
{
System.out.println("什么奖励也没有!");
}
}
}
2021年12月19日
else说明
- else结构是可选的
- 如果多个表达式之间是“互斥关系”(没有交集的关系),哪个判断和执行语句声明在上面还是在下面,无所谓。
- 如果多个表达式之间是有交集的关系,需要根据实际情况,考虑清楚应该哪个结构声明放在上面。
- 如果多个表达式之间有包含的关系,通常情况下,需要将范围小的声明放在范围大的上面。否则范围小的就没有机会执行。score>=60范围大于score>80
输入三个数,然后把三个数从小到大排列,分支就是先用num1和num2比较然后再用num3分别跟num1和num2比较。
import java.util.Scanner;
class IfTest2
{
public static void main(String[] args)
{
Scanner shuru = new Scanner(System.in);//实例化
System.out.println("输入第一个数:");
int num1 = shuru.nextInt();
System.out.println("输入第二个数:");
int num2 = shuru.nextInt();
System.out.println("输入第三个数:");
int num3 = shuru.nextInt();
if (num1 >= num2)
if(num3 >= num1)
{
System.out.println(num2 + "," + num1 + "," + num3);
}
else if (num3 <= num2)
{
System.out.println(num3 + "," + num2 + "," + num1);
}
else
{
System.out.println(num2 + "," + num3 + "," + num1);
}
else
if(num3 >= num2)
{
System.out.println(num1 + "," + num2 + "," + num3);
}
else if(num3 <= num1)
{
System.out.println(num3 + "," + num1 + "," + num2);
}
else
{
System.out.println(num1 + "," + num3 + "," + num2);
}
}
}
2021年12月19日
如何获取一个随机数:10-99
int values = (int)(Math.random() * 90 + 10);//[0.0,1.0)-->[0.0,90.0)-->[10.0,100.0)-->[10,99]最后一步是取整
//公式:[a,b]:(int)(Math.random() * (b - a + 1) + a)