day03 运算符

复习:

1. 注释:在程序中用于解释说明程序的文字。单行注释 --- // 多行注释 --- /* */ 文档注释 --- /** */ --- 文档注释中的文字可以提取出来形成文档--- javadoc ---只能提取公共类

2. 字面量:指的是在计算机中不可变的值。整数常量、小数常量、字符常量、字符串常量、布尔常量、空常量

3. 进制:计数方式。二进制、八进制、十进制、十六进制  19+1=1a  99+1=9a  9f+1=a0  ff+1=100 --- 进制的转换

4. 变量:数据类型 变量名 = 数据;

5. 数据类型:

基本数据类型

byte-1字节  short-2字节   int-4字节  long-8字节  float-4字节  double-8字节  char-2 字节  boolean

byte的取值范围:-128~127

整数默认为int,小数默认为double

结尾标识:long---l float---f

char存储任意的常见字符,底层用的是utf-16编码

引用数据类型---数组、类、接口

数据的转换

自动转换

小类型转换为大类型,整数转换为小数

整数转换为小数的时候可能回产生精度损失

字符能够自动提升为整型

强制转换

大类型强转为小类型的时候会产生数据不准确

小数强转为整数的时候是舍弃小数部分

运算符

算术运算符

+  -  *  /  %  ++  --                                           %(取余)代表取余

byte/short/char在运算的时候会自动提升为int

int在计算完成之后结果一定是int

小类型和大类型运算的时候结果一定是大类型

整数/0 ---整数除零出现算术异常

非零小数/0 非零数字/0.0 --- Infinity

0/0.0 0.0/0 0.0/0.0 --- NaN

%的结果的符号看的%左边数字的符号

++/--   自增或自减      在变量之前要先自增后运算;在变量之后先运算后自增

byte/short/char可以参与自增/自减运算,运算完成之后结果类型没有改变 --- 因为在底层做了一次强制转换

扩展:原反补三码

规定类型的最高位是一个符号位 --- 如果最高位为0表示正数,如果为1表示负数

任何数据在计算机中存储的都是补码,所以在计算的时候实际上也是利用补码来运算的,所以结果也是补码

正数的原反补三码一致

byte b = 127;

0111 1111 --- 原码

0111 1111 --- 反码

0111 1111 --- 补码

负数的反码是在原码的基础上,最高位不变,其余为变为原来相反数,如:0->1或1->0

负数的补码是在反码的基础上+1

byte b = -5;

1000 0101 --- 原码

1111 1010 --- 反码

1111 1011 --- 补码

规定用-0表示当前类型的最小值

1111 1111    补码 十进制为-1

赋值运算符

=  +=   -=   *=   /=   %=   &=   |=   ^=   <<=    >>=    >>>=

除了=以外,其他的符号都是相当于在这个变量本身的基础上来进行运算

int i = 10;

i /= 3;  -> i=i/3  ->i=3

除了=以外,其余的符号都要求这个变量必须有值

byte/short/char都可以参与赋值运算,而且结果是原类型

注意:赋值运算的连等运算

175的二进制1010 1111,正数的源码补码相同,然后由于补码在本题中为为负数,所以反码和源码变为负数。(这种运算首先查看补码,然后计算

 

关系运算符

== 判断两个值是否相等的 != 判断两个值是否相等的 >  <   >=   <=

运算的结果一定是逻辑值---true/false

int i = 3, j = 5;

 i == j --- false

i <= j --- true

逻辑运算符

&--->与表示And    |--->Or    !--->非Not     ^--->亦或       &&--->短路与      ||--->短路或

针对逻辑值进行运算的。

$:   true&true=true       true&false=false       false&true=false       false&false=false

|:   true|true=true         true|false=true            false|true=true           false|false=false

!:   !true=false              !false=true

^:  true^true=false      true^false=true          false^true=true         false^false=false\


&&:运算规则和&一致的。如果前边的表达式的结果是false,则后边的表达式就不再运算,整个结果确定为false

||:运算规则和|一致的。如果前边的表达式的结果是true,则后边的表达式就不再计算,而整个结果确定为true

||&&前边的时候能够把&&给短路掉(不在运算&&后面的),但是&&||前边,不能短路掉||

位运算

注意:位运算针对的整数的补码进行计算

<<  代表左移         >>  代表右移         >>> 代表无符号右移           ~  代表取反


    & (两ture就补)           | (有ture就补)        ^    (同斥异吸)

(计算时将数据转换为补码)


交换值的方式

方式一:亦或法

int x =5, y = 7;

x = x ^ y;     //的到x为2

y = x ^ y; -> y = x ^ y ^ y; -> y = x; -> y = 5;    //x^y值为2,2^y值为5

x = x ^ y; -> x = x ^ y ^ x; -> x = y; -> x = 7;     //x^y值为2,2^x值为7

方式二:加减法

int x = 3, y = 7;

x = x + y;

y = x - y; -> y = x + y - y; -> y = x; -> y = 3;

x = x - y; -> x = x + y - x; -> x = y; -> x = 7;

方式三:追尾法

int x = 3, y = 7;

int z = x;

x = y;

y = z;

扩展:考虑三种方式的优劣性

亦或法的效率最高的,但是它的使用频率最低 --- 只能适用于整数值的交换

加减法的效率低于亦或法但是高于追尾法 --- 理论上适用于数值型

追尾法的效率最低的,但是它的使用频率最高 --- 适用于所有的类型

            << 左移                        >> 右移                            >>>右移

 (计算时将数据转换为补码)

在进行移位运算,并不是直接移动对应的位数,而是将要移动的位数对32进行取余,移动的是余数对应的位数

28 << 35 = 28 << (35 % 32) = 28 << 3 = 224  //当大于位数是取余,余数为移动的位数

100 << 32 = 100

~(取反)的计算公式:~ i= -i - 1 ;

例子:

 

三元运算符

  逻辑值?表达式1:表达式2

执行顺序:先判断逻辑值,如果逻辑值为true,那么执行表达式1;反之执行表达式2

三元表达式依然是一个表达式,所以需要有一个计算结果,这个计算结果定义变量来进行存储

double d = a > b ? 3.5 : 5;

a > b ? 3 : true; --- 因为结果类型不兼容

double d = a > b ? ‘a’ : 2.26;

练习:

1. 定义一个整数变量,判断这个整数是一个奇数还是一个偶数

代码:int num =15;
        String tr= num %2 ==1? "奇数":"偶数";
        //String tr=(num&1)==1? "奇数":"偶数";
         System.out.println(tr);

2. 定义一个变量表示分数,分数>=90-A >= 80-B >=70-C >=60-D <60-E

代码:int s=76;
        String str=s>=90? "a":(s>=80?"b":(s>=70?"c":(s>=60?"d":"e")));
        System.out.println(str);

3. 定义一个变量表示年份,判断这一年是平年还是闰年 --- 逢百年整除400,不是百年整除4

代码:int num=1200;
       String str=num%4==0?"闰年":(num%400==0?"闰年":"平年");
        System.out.println(str);

2000---闰年 2100--平年 2012---闰年

4.查找2的幂次方数

代码:int n=21;
        String str=(n&(n-1))==0?"是":"否";

        System.out.println(str);


运算符的优先级

()  ~   ++   --    !    *    /    %    +   -    <<   >>   >>>    关系     逻辑    &     |     ^     三元     赋值

一元运算 > 二元运算 > 三元运算 > 赋值

流程控制

顺序结构:指代码从上到下从左到右来依次编译执行

分支结构

判断结构

if(逻辑值){

代码块;

}

执行顺序:如果逻辑值为true,那么就执行代码块;反之就不执行代码块

从控制台获取数据

需要在类外写:import java.util.Scanner;

在主函数里边:

Scanner s = new Scanner(System.in);

int i = s.nextInt(); // 获取整数

double d = s.nextDouble();  // 获取小数

String str = s.nextLine(); // 获取字符串


猜你喜欢

转载自blog.csdn.net/gwl_123456/article/details/80888256
今日推荐