1.位运算符
1.1 二进制运算
//运算符
int result = 12 & 3;
System.out.println(result);//结果:0
//按位与运算 & A&B
//将A和B转成二进制,右侧对其,上下比较,两者都为1,结果才为1,否则为0,最后转换成十进制得到结果
result = 12 & 11;
System.out.println(result);//结果:8
//按位或运算 | A|B
result = 12 | 11;
//两者有一个为1,结果就为1,两者全为0,结果才为0
System.out.println(result);//结果:15
//按位异或运算
result = 12 ^ 11;
//两者转成二进制,右侧对其,上下比较,两者不同则为1,相同则为0
System.out.println(result);//结果:7
练习:
对两个数的值进行交换
//交换变量值
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;
1.2反码运算
//反码运算
result = ~11;
System.out.println(result);//结果:-12
//反码 ~ 将二进制中的0换1,1换0
1.3移位运算
//移位运算 << 向左移位,放大 >> 向右移位,缩小
result = 1<<2;
System.out.println(result);//结果:4
result = -1>>2;
//向右移位左侧补符号位
System.out.println(result);//结果:-1
result = 3>>1;
System.out.println(result);//结果:1
// >>> 空出来的位置补0
System.out.println(Integer.MAX_VALUE);//2147483647
result = -1>>>1;
System.out.println(result);//2147483647
首先说明正数和负数的二进制表示的区别就是负数的二进制最高位吧正数的0换成1
3的原码为: 00000000 00000000 00000000 00000011
-3的原码就是:10000000 00000000 00000000 00000011
-3 << 3 为: 10000000 00000000 00000000 00011000
比如:-2
原码转补码
原码: 00000000 00000000 00000000 00000010
取反(反码):11111111 11111111 11111111 11111101
加一(补码):11111111 11111111 11111111 11111110
补码转原码:
补码: 11111111 11111111 11111111 11111110
取反(反码):00000000 00000000 00000000 00000001
加一(原码):00000000 00000000 00000000 00000010
比如:-3>>3
原码:10000000 00000000 00000000 00000010
反码:11111111 11111111 11111111 11111101
补码:11111111 11111111 11111111 11111110
由于负数左右移动是操作的补码,所以-3右移三位补码为
补码:11111111 11111111 11111111 11111111
反码:10000000 00000000 00000000 00000000
原码:10000000 00000000 00000000 00000001
所以为-1
-3>>3=-1
无符号右移(>>>)就是不管是正数还是负数,都是补零。所以当负数进行位运算的时候会和想象的有很大的差别。
1.4其他
// & | 也可以对boolean值运算,得到boolean值
boolean bool = true & false;// & 和&&运算结果一样,运算过程不一样
int a=12,b=12;
bool = a++<12&b++>12;//将a和b的值转成二进制然后比较
bool = a++<12&&b++>12;
// & 与 &&的不同:&是位运算符,&&是逻辑运算符 ,&不具有短路效果,即左边false,右边还会执行;&&具有短路效果,左边为false,右边则不执行
2.赋值运算符
//赋值运算 = += -= *= /= %=
a=12;
a+=2;//和a=a+2不一样,只是int可以,byte类型就不行
a-=2;
a*=2;
a/=2;
a%=2;
3.三元运算符
//三元运算 A?B:C A是boolean类型,A是true,取B,是false,取C
int result1=true?11:22;
System.out.println(result1);
result1=12.3!=48?'b':322;//这种形式也可以
练习:
System.out.println(true?3:4.0);//结果是3.0 有double类型参与要用double
4.流程控制
4.1if和switch
int score = 87;
if (score >= 60) {
System.out.println("及格了");
} else {
System.out.println("不及格");
}//必须以if开头,不能只写else
//switch case
//匹配某一个变量的值,如果匹配到某一个case的项,就从这个case开始运行
//运行到break或者代码块结束
//所有的case项都没有匹配成功,会执行default
//case项和default项的顺序可以打乱
//switch可以匹配的类型char, byte, short, int, Enum(枚举),String
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;//如果不加break,会从2(夏)开始一直到4(冬)运行到代码块结束,输出夏秋冬
default:
System.out.println("季节");
}
4.2循环
//循环
//while (继续循环的条件){
// 循环体
//}
// int i='a';
// while (i<'e'){
// System.out.println((char)i);
// i++;
// }
//do...while至少执行一次,先执行后判断
// do {
// }while();
//for循环
// for(;;){
// //无限(死)循环
// }
for (int n = 0; n < 10; n++) {
System.out.println(1 + n);
}
//
Math.random();//[0,1)随机数
int cat = 100;
int count = 0;
int mouse = (int) (Math.random() * 120);
while (cat > mouse) {
count++;
mouse = (int) (Math.random() * 120);
}
System.out.println("猫抓了" + count + "只老鼠。");
int num1 = 0;
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0) {
num1 += i;
}
}
System.out.println(num1);
//break 直接跳出循环体 confinue结束当前一次循环,开始下一次循环
for (int aa = 1; aa < 10; aa++) {
if (aa % 7 == 0) {
// break;
continue;
}
System.out.println(aa);
}
// boolean bool=true;
// easy:for (;;){
// for (;;){
// for (int bb=0;bb<100;bb++)
// {
// if (bb%5==0)
// {
// break easy;//通过easy来使break跳出多重循环
// }
// System.out.println(bb);
// }
// }
// }
//死循环 没有循环结束的条件,之后不能写其他代码
//无限循环 结束循环的条件永远达不到,可以编写其他代码
// while (true){
// }死循环
// a=0;
// while(a<100){a--}无限循环
//死循环会直接报错,无限循环默认有条件可以循环
5.数组
//数组
//定义
int[] arr={1,2,3,4};
int[] arrB=new int[]{1,2,3};
//这两种是静态的
int[] arrA=new int[4];//通过长度定义数组 【4】代表可以存放四个元素
//这是动态的
//数组的限定
//1.只能存放指定类型的数据
//2.数组的长度是不可变的
//使用数组的元素 下标 从0开始依次增加
System.out.println(arr[3]);//结果:4
System.out.println(arr);//显示数组的地址
arr[0]=99;//给数组元素赋值
System.out.println(Arrays.toString(arr));//将数组转化成字符串打印
//获取数组长度
System.out.println(arr.length);
//打印出arr数组中所有元素
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
//二维数组 将一维数组中的元素变成一维数组
int[][] arrs=new int[4][3];
arrs[0][1]=12;
System.out.println(Arrays.deepToString(arrs));
//二维数组的限定 一维数组的个数不可变(比如上述arrs的【4】)也就是大的数组个数不可变
arrs[2]=new int[]{1,2,3,4};
System.out.println(Arrays.deepToString(arrs));
//声明一个二维数组 使用随机数为每个元素赋值
int[][] arrC=new int[5][4];
for (int i=0;i<arrC.length;i++){
System.out.println(Arrays.toString(arrC[i]));
for (int j=0;j<arrC[i].length;j++){
arrC[i][j]=(int)(Math.random()*100);
}
System.out.println(Arrays.toString(arrC[i]));
}
System.out.println(Arrays.deepToString(arrC));
//数组下标越界
arr=new int[4];
System.out.println(Arrays.toString(arr));
arr[2]=9;
// arr[4]=11;报错越界