位运算符
位运算符进行二进制计算(&,|,~,<<,>>,>>>)
按位与运算 &,将a和b转为二进制数,将二者右侧对齐,两者皆为1结果唯一,否则为0;
按位或运算,二者有一个为1,则结果为1;
按位异或运算,二者不同则为1,相同则为0;
反码运算,将二进制中的0换成1,1换成0
移位运算
<< 左移(二进制数)每左移1位数值放大2倍
>>右移左侧补符号位 -1>>2 = -1 ,-1在二进制中用补码表示为(32位全1,首位符号位)
>>>右移左侧补0 -1>>>1 =2147483647(int范围最大值)
计算机最快的乘法运算方式是移位 3*8 3<<3
按位运算符也可对boolean类型运算。
boolean类型中按位运算和逻辑运算区别:
&是位运算符,&&是逻辑运算符,
&没有短路现象;因为&需要将前后两个值进行位运算,无法只通过前一个的值确定整个式子的值。
public static void main(String[] args){
// 按位与运算,将a和b转为二进制数,将二者右侧对齐,两者皆为1结果唯一,否则为0
int result = 12&11;//1100 1011
System.out.println(result);//结果为1000(二进制),8(十进制)
//按位或运算,二者有一个为一,则结果唯一
result = 12|11;
System.out.println(result);//结果为1111(二进制),15(十进制)
//按位异或运算,二者不同则为1,相同则为0
result = 12^11;
System.out.println(result);//结果为0111(二进制),7(十进制)
//反码运算,将二进制中的0换成1,1换成0
result=~11;
System.out.println(result);//-12
//移位运算
// << 左移(二进制数)左移数值放大2倍
result=1<<2;
System.out.println(result);//4
//-1在二进制中用补码表示为(32位全1,首位符号位)
// >>右移左侧补符号位 -1>>2 = -1
result=3>>1;
System.out.println(result);//1
// >>>右移左侧补0 -1>>>1 =2147483647(int范围最大值)
result = -1 >>>1;
System.out.println(result);//4
//按位运算符也可对boolean类型运算
int a=12;
int b=12;
boolean bool = true & false;
}
赋值运算
赋值运算符有 = ,+=, -=, *=,/=,%=
int a = 14;
a+=2;//将a+2的值赋给a,与a=a+2在树值上相同,如果a的数据类型不是int类型,则a=a+2会发生数据类型转换。
交换变量值
//引入第三个数交换
int a=11;
int b=22;
int c=a;
a=b;
b=c;
System.out.println(a+"----"+b);
//加法交换
a=11;
b=22;
a=a+b;// a=33 b=22;
b=a-b;// a=33 b=11;
a=a-b;// a=22 b=11;
System.out.println(a+"======="+b);
//异或运算
a=11;
b=22;
a=a^b; // a=29 b=22;
b=a^b; // a=29 b=11;
a=a^b; // a=22 b=11;
三元运算
a?b:c a为真取b的值,a为假取c的值。
如果a和b的数据类型不同,则在输出结果时会取较大的数据类型作为输出结果的数据类型。(在使用编译软件时发现System.out.println(12!=1?'a':4);
的输出结果是字符型)
int result=true?11:13;
System.out.println(result);// 11
result=12!=1?'a':4;
System.out.println(result);//97
System.out.println(12!=1?'a':4);//a
System.out.println(true?3:4.0);//3.0
运算符的计算顺序
流程控制
if else语句;switch case语句
switch 匹配某一个变量的值,如果匹配到某一个case项,就从这个case项开始运行 case
运行到break或者代码块结束
所有的代码块都没有匹配成功,才会运行defeat项,case和defeat和顺序可以打乱
运行顺序从上到下。直到遇见break或continue
switch 可以匹配int,short,byte,char,String,Enum(枚举)类型
一个简单的switch语句
int num=2;
switch(num){
case 1:
System.out.println("第一季");
break;
case 2:
System.out.println("第二季");
break;
case 3:
System.out.println("第三季");
break;
case 4:
System.out.println("第四季");
break;
default:
System.out.println("季");
break;
}
循环语句
while(){}循环 do{}while()循环 for(;;)循环
break;//结束所在的循环
continue;//结束本次循环,进入下一次循环
break跳出多重循环的方式
用变量控制多重循环 boolean bool=true for(;bool&&...;)
为循环命名,跳出多重循环 break + 循环名
ea:for (;;){
for (;;){
for (int bb=0;bb<100;bb++){
if (bb==50){
// break;//跳出单个循环
//跳出多重循环 break + 循环名
break ea;
}
}
}
}
死循环和无限循环
死循环 没有结束条件的循环,之后不能在写其他代码(编译器会报错) while(true)
//无限循环 结束循环的条件永远达不到,可继续编写其它代码(编译器不会报错)int a=1; while(a<2) {a--;}
数组的限定
1.只能存放指定类型的数据
2.数组的长度不可变
设置元素
a[0]=6;
获取数组的长度
System.out.println(a.length);
数组元素的使用 下标 从0开始依次增加
System.out.println(a[3]);
System.out.println(a);
System.out.println(Arrays.toString(a));
二维数组
int[][] arrs=new int[4][2];
arrs[0][1]=12;
System.out.println(Arrays.deepToString(arrs));
二维数组的限定 一维数组的个数不可变
arrs[2]=new int[]{1,2,3,4};
System.out.println(Arrays.deepToString(arrs));
数组下标越界
arr=new int[4];
arr[4]=90;//越界异常
声明一个二维数组,使用随机数为每个元素赋值
int[][] arrb=new int[5][4];
for (int i=0;i< arrb.length;i++){
for (int j=0;j<arrb[i].length;j++){
arrb[i][j]=(int)(88*Math.random());
}
System.out.println(Arrays.toString(arrb[i]));
}
System.out.println(Arrays.deepToString(arrb));
练习
1.成绩等级
package com.easya;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入成绩");
int score = scan.nextInt();
if (score<60){
System.out.println("不及格");
} else if (score<70) {
System.out.println("及格");
}else if (score<85) {
System.out.println("良好");
}else {
System.out.println("优秀");
}
scan.close();
}
}
2.一维数组元素求和
package com.easya;
public class Test4 {
public static void main(String[] args) {
//数组元素求和
int[] a =new int[]{10,66,78,9,34,99};
int sum=0;
for (int j=0;j<a.length;j++){
sum+=a[j];
}
System.out.println(sum);
}
}
3.声明一个数组并赋值,声明一个变量并赋值,打印出这个变量的值在数组第一次出现的下标,如果没有出现过就打印-1
package com.easya;
public class Test7 {
public static void main(String[] args) {
//声明一个数组并赋值,声明一个变量并赋值,打印出这个变量的值在数组第一次出现的下标,如果没有出现过就打印-1
int[] arr = new int[]{10,39,98,88,676,89};
int t=98;
int k=-2;
for (int i=0;i<arr.length;i++){
if(t==arr[i]) {
k=i;
break;
}
}
if (k!=-2){
System.out.println(k);
}else {
System.out.println(-1);
}
}
}
4.九九乘法表
package com.easya;
public class Test8 {
public static void main(String[] args) {
//乘法口诀表
for (int i=1;i<10;i++){
for (int k=1;k<=i;k++){
System.out.print(k+"x"+i+"="+(i*k)+" ");
}
System.out.println("");
}
}
}
5.打印1000以内的完数和素数
package com.easya;
public class Test9 {
public static void main(String[] args) {
//打印出1000以内所有完数,质数
System.out.print("1000以内的完数有:");
for (int m=2;m<=1000;m++){
int sum =0;
for(int n=1;n*2<=m;n++){
if(m%n==0){
sum+=n;
}
}
if(sum==m){
System.out.print(sum+" ");
}
}
System.out.println("");
System.out.print("1000以内的素数有:");
for (int k=2;k<=1000;k++){
int count =0;
for(int j=2;j*j<=k;j++){
if(k%j==0){
count++;
}
}
if(count==0) {
System.out.print(k+" ");
}
}
}
}