位运算符
左移<<
乘以2的次幂运算,移几位就是几次幂
右移>>
除以2的次幂运算,移几位就是几次幂
右移时,原最高位是什么,空位就补什么
无符号右移>>>>
无论原最高位是什么,空位都补零。
比如在八进制、十六进制时
与运算符&
可用于获取二进制中的有效位1
比如:XXXXXXXX&00000111=XXXXXXXX的后三位
或运算|
6|3=110|011=111=7
异或^(记住它的技巧性)
6^ 3=110^011=101=5
6^ 3^3=6;
6^ 3^6=3;
一个数A连续^同一个数B,还是原来的数字A
按位取反~(易错)
~6 = ~ 0000 0110=11111001因为计算机中负数要储存其补码
11111001—取反10000110—加10000111=-7
补充:
对于正数来说,其二进制原码,反码,补码均为相同的,为原码的形式;
对于负数来说,其反码为符号位保持不变,其余各位取反,其补码为符号位保持不变,其余各位取反后再在最后一位上加1
练习
1.用最效率的方法算出2乘以8
解:通过位运算完成
public class myclass {
public static void main(String[] args) {
System.out.println(2<<3);
}
}
1
2
3
4
5
2.对两个整数变量的值进行互换,不需要第三方变量
//通过和的形式,有个弊端,两个数据较大,可能会超出int的范围
a=a+b;//a=3+7=10
b=a-b;//b=3+7-7=3
a=a-b;//a=10-3=7
System.out.println("a="+a+";b="+b);
1
2
3
4
5
或者
//用异或
a=a^ b;//a=3^7;
b=a^ b;//b=3^ 7^7=3
a=a^ b;//a=3^ 7^3=7
System.out.println("a="+a+";b="+b);
1
2
3
4
5
三元运算符
(条件表达式)?表达式1:表达式2
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2.
练习:
需求:三个数,想知道最大的哪个?
自己做的答案:
int a=3,b=5,c=10;
int max;
max=a>b?a:b;
max=max>c?max:c;
System.out.println("max="+max);
1
2
3
4
5
程序流程控制
顺序结构
从头到尾执行
判断结构
if(条件表达式){
执行语句
}
1
2
3
if(条件表达式){
执行语句;
}
else{
执行语句;
}//和三元运算符很像。理解为三元运算符是if else的简写格式
//区别不是所有的if else都能简化,因为三元运算符运算完必须有结果!
1
2
3
4
5
6
7
if(条件表达式){
执行语句;
}
else if(条件表达式){
执行语句;
}
else{
执行语句;
}//单条语句。else表示上面的条件 不满足
1
2
3
4
5
6
7
8
9
注意:执行语句为单条时,可以省略括号,多条时不可省。
练习:
需求:根据用户的给定的数值,显示该数值对应的星期,如:2,星期二。
思路:
1.怎么获取这个数值?来源有很多,不确定,只要是不确定的数据,都用变量存储,只要操作该变量即可。
2.数值不确定,如何显示对应的星期?那就需要对该数值进行判断。
3.怎么显示?通过输出语句就可以显示在屏幕上。
步骤
1.定义变量,记录数据
2.通过判断结构语句if对该变量进行判断
3.根据不同条件,通过输出语句显示不同的结果
int week=3;
if(week==1)
System.out.println("星期一")
else if(week==2)
System.out.println("星期二")
else if(week==3)
System.out.println("星期三")
else if(week==4)
System.out.println("星期四")
else if(week==5)
System.out.println("星期五")
else if(week==6)
System.out.println("星期六")
else if(week==7)
System.out.println("星期日")
else
System.out.println("没有对应的星期")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
选择结构
switch语句
switch(表达式)
{
case 取值1;
执行语句;
break;
case 取值2;
执行语句;
break;
……
default;
执行语句;
break;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
特点:
1.答案的书写没有顺序;
2.匹配的答案被执行,一直执行到break结束或者执行到switch语句结束.
3.表达式只支持byte、short、int、char,5.0增enum, 7.0增加string.
上面的练习题用switch来做:
switch和if的区别:
1.if可以用于判断数值,也可以判断区间,只要运算结果是boolean类型,都可以进行判断。
2.switch用于对固定几个值,进行判断。判断的值得类型有限。
int week=3;
switch(week) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("没有对应的星期");
break;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
循环结构
代表语句:while,do while,for
当对某些语句需要执行很多次时,就是用循环网络。
while
while(条件表达式)//如果这里加;,那么结果一直会运不出来,程序会反复问自己,是否一直是这个条件。
{
执行语句;
}
1
2
3
4
练习
需求1:1—10
int i=1;
while(i<=10) {
System.out.println(i);
i++;
1
2
3
4
需求2:运算1-10的和
思路:
1+2+3+……
每次重复的都是和+下一个数。
和是确定的么?不确定,需要变量。
下一个数是确定的么?不确定,需要变量。
和+下一个数在重复,说明需要执行多次,用循环。
下一个数是有规律的,自增。
步骤:
1.定义变量,一个记录和,另一个记录下一个数;
2.需要循环结构;
3.循环中需要进行和+下一个数的运算,并让下一个数自增。
int i=1,sum=0;
while(i<=10) {
sum+=i;
i++;
}
System.out.println("sum="sum);
1
2
3
4
5
6
do while
do
{
执行语句;
}while(条件表达式);
1
2
3
4
do while特点:无论条件是否满足,循环体至少执行一次。
for
for(初始化表达式;循环条件表达式;循环后的操作表达式){
执行语句;(循环体)
}
1
2
3
for和while的区别
for中定义的循环变量只对循环体有效,除了循环体,变量相当于没有定义。
如果定义的变量仅仅只为循环而存在,建议用for;如果全局都需要,用while.
可能会放一个无限循环用来放缓冲时间,直到触发跳出条件。
//最简单的无限循环;
while(true){ }
for(; ;){ }//for循环不写条件,默认是真
1
2
3
练习
需求:获取1-100之间6的倍数的个数。
思路:
1.个数是未知的,所以定义变量。
2.6的倍数怎么表示?只要是对6能整除,也就是没有余数。
3.需要对1-100之间所有的数都要进行判断是不是6的倍数。如果是,需要对个数变量进行自增。
4.怎么完成1-1001之间呢?使用循环。
步骤:
1.定义变量,记录个数。记录1-100变化的数。
2.定义循环,遍历1-100.
3.在循环中对1-100的数字进行判断。
4.满足条件,个数变量自增。
int count=0;
for(int i=1;i<=100;i++) {
if(i%6==0)
count++;
}
System.out.println(count);
1
2
3
4
5
6
7
for嵌套语句
外循环控制的是行数
内循环控制的是列数
for(int i=0;i<3;i++) {
for(int j=0;j<4;j++) {
System.out.print("*");
}
System.out.println();//换行
}
1
2
3
4
5
6
结果:
****
****
****
1
2
3
练习
需求:在屏幕中显示以下图形
*****
****
***
**
*
1
2
3
4
5
思路:
1.看其图形,是由5行组成的,
2.每一行都有多个∗ *∗
3.多行,循环就可以搞定,每到一行,里面有多个∗ *∗。循环内,还需要循环负责每一行的星的个数。
4.外循环控制行数,内循环控制每一行的个数
步骤:
1.for的嵌套循环
for(int i=0,m=5;i<5;i++) {
for(int j=0;j<m;j++) {
System.out.print("*");
}
m--;
System.out.println();
}
1
2
3
4
5
6
7
或
for(int i=0;i<5;i++) {
for(int j=i;j<5;j++) {
System.out.print("*");
}
System.out.println();
}
1
2
3
4
5
6
需求
在屏幕中显示以下图形
*
**
***
*****
******
1
2
3
4
5
for(int i=0;i<5;i++) {
for(int j=5;j>i;j--) {
System.out.print("*");
}
System.out.println();
}
1
2
3
4
5
6
break(跳出)
break适用范围:switch;循环语句
for(int i=0;i<3;i++) {
System.out.println(i);
break;
1
2
3
结果:0
outer:for(int i=0;i<3;i++) {
inner:for(int j=0;j<3;j++) {
System.out.println(i);
break outer;
1
2
3
4
结果:0
continue(继续)
continue作用范围:只作用于循环结构
结束本次循环,继续下次循环
for(int i=0;i<3;i++) {
System.out.println("i="+i);
continue;
}
1
2
3
4
结果:
i=0
i=1
i=2
1
2
3
for(int i=0;i<10;i++) {
if(i%2==0)
continue; //当条件语句,如果i是偶数,就继续循环,直接i+1。
System.out.println("i="+i);
}
1
2
3
4
5
结果:
i=1
i=3
i=5
i=7
i=9
1
2
3
4
5
outer:for(int i=0;i<3;i++) {
inner: for(int j=0;j<4;j++) {
System.out.println("i="+i);
continue outer; //结束outer循环,继续下一次outer循环
}
}
1
2
3
4
5
6
结果:
i=0
i=1
i=2
1
2
3
练习
switch季节
需求2:根据用户的给定月份数据,显示该月份在哪个季节
3,4,5 春季
6,7,8夏季
9,10,11秋季
12,1,2春季
思路:
1.怎么获取数据?我只要关注变量。
2.对这个数据进行判断
步骤:
1.定义变量
2.定义if语句判断。
填代码:
int i = 12;
if (i>2&&i<6)
System.out.println("春季");
else if(i>5&&i<9)
System.out.println("夏季");
else if(i>8&&i<12)
System.out.println("秋季");
else if((i>0&&i<3)||i==12)
System.out.println("冬季");
//else if(i==12)
// System.out.println("冬季");
else
System.out.println("输入错误,请重新输入");
1
2
3
4
5
6
7
8
9
10
11
12
13
或者
int i=12;
switch(i) {
case 3:
case 4:
case 5:
System.out.print("春季");
break;
case 6:
case 7:
case 8:
System.out.print("夏季");
break;
case 9:
case 10:
case 11:
System.out.print("秋季");
break;
case 12:
case 1:
case 2:
System.out.print("冬季");
break;
default:
System.out.print("没有对应的季节");
break;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
十六进制(重点&难点)
需求3:对给定的整数26,获取其十六进制的表现形式?(重点&难点)
思路:
1.什么是十六进制?数据的一种表现形式,好处在于可以表现形式更短。
原理:将十二进制中4位为一个十六进制位
2.原理就是对给定的整数进行二进制的每4位的获取。
(注意:计算机中是4个8位)
3.怎么获取每4位?其实就是获取四位中的1,可以通过&运算的方式完成。
4.而且想要获取下四位,可以通过对原数据进行无符号右移的方式。
步骤:
1.定义变量记录该整数。
2对该变量进行&运算,既然是获取四位,就&四个1,二进制四个1就是十进制的15.
3.对原数据进行无符号右移四位。
/* ASCII 97 98 99 100 101 102
'0'-'9' 'a' 'b' 'c' 'd' 'e' 'f'
0-9 10 11 12 13 14 15
*/
int num=26;
int n1=num&15;
System.out.println("n1="+(char)(n1-10+'a'));
num=num>>>4;
int n2=num&15;
System.out.println("n2="+n2);
1
2
3
4
5
6
7
8
9
10
可以发现,运算是重复的,到底&15的结果是否需要做这个字母转换,无法确定。
所以通过学习的语句来完成。
1.通过循环,完成重复的运算。
2.通过if完成是否需要转成字母的判断。
转16进制语句版
int num=26;
for(int i=1;i<=8;i++) {
int n=num&15;
if(n>9)
System.out.println("n="+(char)(n-10+'a'));
else
System.out.println("n="+n);
num=num>>>4;
}
1
2
3
4
5
6
7
8
9
输出:
n=a
n=1
n=0
n=0
n=0
n=0
n=0
n=0
1
2
3
4
5
6
7
8
后记:两个问题没解决,1.反了;2.多零。需要对多数据进行存储。等数组学完后再完善。
三个数求最大
int a=1,b=5,c=3;
int tempMax=a>b?a:b;//变量中第一个单词首字母小写,第二个单词首字母大写;类的首字母大写;变量,方法的首字母小写
int max=tempMax>c?tempMax:c;
System.out.println("max="+max);
1
2
3
4
数字三角形(重点&难点)
需求:要求在屏幕上显示下列内容
54321
5432
54
5
大圈套小圈的思想,for嵌套循环。
先做内循环,看每一行
for(int i=1;i<=5;i++) {
for(int j=5;j>=i;j--) {
System.out.print(j);
}
System.out.println();
}
1
2
3
4
5
6
九九乘法表(重点&难点)
补充:table制表符
java中用"\t"来表示
其余转义字符: \n换行(Linux); \r换行(Windows); dos里两种都支持换行
java具有跨平台性,所以\n \r在java中不怎么用
for(int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
System.out.print(j+"*"+i+"="+j*i+"\t" );
}
System.out.println();
}
1
2
3
4
5
6
结果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1
2
3
4
5
6
7
8
9
输出"helloword"
System.out.println("\"helloworld\""); // 用转义字符\"
1
结果:
"helloworld"
---------------------
【转载】仅作分享,侵删
作者:ChunyeLi
原文:https://blog.csdn.net/sinat_32512123/article/details/84619320
|
|