移位运算符
Scanner
Random
流程控制
一、移位运算符
java
位运算符的左移和右移
* >>有符号右移
* <<左移运算符
* >>>无符号右移
m >> n : 将m转换成二进制,然后向右移动n位
* 如果m是正数,则前面补n个0
* 如果m是负数,则前面补n个1
m << n : 将m转换成二进制,然后向左移动n位,不分正负,后面补n个0
m >>> n: 将m转换成二进制,然后向右移动n位,不分正负,前面补n个0
假设有一个数:
如果想要表示-5
原码:一个正数,按照绝对值的大小转换成二进制.
一个负数,按照绝对值的大小转换成二进制数,然后高位补1,称为原码
反码:有个正数,反码与原码相同
负数的反码是对这个数的原码除符号位之外的其余各位,取反
补码:有个正数,补码与原码相同
负数的补码为这个数的原码除符号位之外各个位取反,然后在最后一位加1
int i = 5;
5 : 0000 0000 0000 0000 0000 0000 0000 0101 原码
0000 0000 0000 0000 0000 0000 0000 0101 反码
-5 : 1000 0000 0000 0000 0000 0000 0000 0101 原码
1111 1111 1111 1111 1111 1111 1111 1010 反码
1111 1111 1111 1111 1111 1111 1111 1011 补码
1111 1111 1111 1111 1111 1111 1111 1110 向右移动两位
1000 0000 0000 0000 0000 0000 0000 0001 除符号位之外其余的位数取反
1000 0000 0000 0000 0000 0000 0000 0010 取反之后加1
-7 : 1000 0000 0000 0000 0000 0000 0000 0111 原码
1111 1111 1111 1111 1111 1111 1111 1000 反码
1111 1111 1111 1111 1111 1111 1111 1001 补码
1111 1111 1111 1111 1111 1111 1111 1110 向右移动两位
1000 0000 0000 0000 0000 0000 0000 0001 除符号位之外其余的位数取反
1000 0000 0000 0000 0000 0000 0000 0010 取反之后加1
原来的数取反之后就是一个负数
0000 0000 0000 0000 0000 0000 0000 0100 4
负数转换成二进制数:
就是将其相反数的补码的每一位取反(1变0,0变1),最后将变完的数值加1,最终完成负数补码运算
```
二、Sacanner
java
Scanner:
* 扫描器,作用是将用户输入到控制台的信息获取到
next():
* 1、一定要读取到有效字符之后才可以结束输入
* 2、对输入的有效字符之前遇到的空白,next()方法会自动将其去掉
* 3、只有输入有效值之后将其后面输入的空白作为分隔符或者结束符
* next()不能得到带有空格的字符
nextLine():
* 1、以ENTER为结束符的,也就是说nextLine()方法返回的是输入回车之前的所有的字符
* 2、可以获取到空白
步骤:
java
//1、创建对象
// 语法:类名 对象名 = new 类名();
// 因为这个类是java的内置类,所以我们通过导包的操作将这个类在库中地址找到就可以引用了
// System.in:这表示系统的中输入流信息
// 这个创建对象的过程除了sc是自己定义的,其余的部分都只能原样写
Scanner sc = new Scanner(System.in);
//2、写一个提示性的语句,告诉用户他现在要往系统中输入什么信息
System.out.println("请输入你的密码:");
System.out.println("请输入你的用户名:");
//3、创建一个变量,用来接收用户输入到系统中的信息
// sc指的是调用这个扫描器,(.next:)
// 当我们调用这个方法的时候就可以去获取一个字符串信息
// 输入信息之后回车表示输入完毕,信息读取无法读取空格之后的内容
String pwd = sc.next();
//4、对信息进行处理
System.out.println("你输入的密码是:" + pwd);
//获取前面的一个信息获取完毕之后剩余的所有的信息
String username = sc.nextLine();
System.out.println("你输入的用户名是:" + username);
System.out.println(username.length());
```
##### 注意:
使用Scanner的时候,基本数据类型和引用数据类型中哪些数据是可以接收的
八种基本数据类型中除了char类型无法使用Scanner进行接收值之外,其余的数据类型都可以处理
### 三、Random
```java
//创建对象:
Random r = new Random();
//如果是一个整数类型的变量来接收,默认生成int类型内的所有的数
int num1 = r.nextInt();
System.out.println("num1 = " + num1);
//如果在nextInt(int bound):bound是几,就生成0 ~ 几之间的随机数
//包含0,但是不包含bound
int num2 = r.nextInt(10);
System.out.println("num2 = " + num2);
//如果接收值的变量是一个double类型的值,那么生成0 ~ 1之间的随机数
//包含0但是不包含1
double num3 = r.nextDouble();
System.out.println("num3 = " + num3);
//生成65 ~ 90之间的随机数
//r.nextInt(91 - 65):0 ~ 26,不包含26的整数
//65 + 00 = 65
//65 + 25 = 90
int num4 = 65 + r.nextInt(91 - 65);
System.out.println(num4);
```
```java
//默认生成0 - 1之间的随机小数,包含0但是不包含1
double a = Math.random();
System.out.println("a = " + a);
//生成0 ~ 100之间的随机小数
double b = Math.random() * 100;
System.out.println("b = " + b);
//生成0 ~ 100之间的随机整数
int c = (int)(Math.random() * 100);
System.out.println("c = " + c);
//生成19968 ~ 40869之间的随机数,转换成汉字 0 ~ 20902
int d = 19968 + (int)(Math.random() * (40870 - 19968));
char e = (char)d;
System.out.println("e = " + e);
```
### 四、流程控制
```java
/**
* 分支语句:根据条件来执行程序
* 语句体里面可以写任何的内容
* if语句:
* 语法:
* if(条件表达式){
* 语句体1;
* }
* 执行过程:
* 如果条件表达式为true,就执行语句体;
* 如果条件表达式为false,就不执行
*
* @author chenyang Zheng
*
*/
public static void main(String[] args) {
Random r = new Random();
//生成0 ~ 100之间的随机数
int m = r.nextInt(100);
if(m % 3 == 0) {//条件表达式
System.out.println( m + "是3的倍数");
}
}
```
![if](pic\if.jpg)
```java
/**
* ifelse语法:
* if(条件表达式){
* 语句体1;
* }else{
* 语句体2;
* }
*
* 执行过程:
* 如果条件表达式的值为true,就执行语句体1;
* 如果条件表达式的值为false,就执行语句体2;
*
* @author chenyang Zheng
*
*/
public static void main(String[] args) {
//输入账号和密码,如果有一项是错误的,就输出登录失败
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的账号:");
String name = sc.next();
System.out.println("请输入你的密码:");
String pwd = sc.next();
//比较两个字符串的内容是不是相同使用(字符串.equalse(字串符))
if(name.equals("东北饺子") && pwd.equals("88888888")) {
System.out.println("欢迎光临东北饺子馆");
}else {
System.out.println("密码都不对,还连个锤子");
}
}
```
![ifelse](pic\ifelse.jpg)
```java
/**
* if...else...if
* 语法:
* if(条件表达式1){
* 语句体1;
* }else if(条件表达式2){
* 语句体2;
* }else if(条件表达式3){
* 语句体3;
* ...
* }else{
* 语句体n;
* }
* 执行过程:
* 哪个条件表达式的值是true,就执行哪个语句体,如果都不为true,就执行最后一个else里面的语句体
* @author chenyang Zheng
*
*/
public static void main(String[] args) {
//输入一个月份,判断这个月份有几天
Scanner sc = new Scanner(System.in);
int day = 0;//定义一个变量来接收天数
System.out.println("请输入一个年份:");
int year = sc.nextInt();
System.out.println("请输入一个月份:");
int month = sc.nextInt();
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 ) {
day = 31;
}else if(month == 4 || month == 6 || month == 9 || month == 11 ) {
day = 30;
}else if(month == 2) {
//因为2月份平年和闰年的天数不同,所以我们要判断平闰年
//平常年份,能被4整除但是不能被100整除
//世纪年份,能被400整除
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
day = 29;
}else {
day = 28;
}
}else {
System.out.println("你看看你输得是啥?");
}
System.out.println(year + "年" + month + "月" + "有" + day + "天");
```
![ifelseif](pic\ifelseif.jpg)