0002.Java学习—运算符与进制

运算符

概述

  1. 运算符接受一个或多个参数并生成新值。
  2. 运算符的优先级决定了多个运算符之间的运算顺序。

优先级

Java运算符符合数学运算:先乘除,后加减;如果想提高运算顺序,可以添加小括号。
在这里插入图片描述
其中:

  1. &&的优先级比||的优先级高
  2. +=是右结合运算符
//以下两种表达式等价
a || b && c
c || (a && b)
//以下两种表达式等价
a += b += c
a += (b += c)

赋值

  1. 运算符的赋值由符号 = 表示
  2. 赋值包括两个步骤:(1). 获取 ‘=’ 右边的值 (2). 将值赋值给 ‘=’ 左边变量
  3. 右边可以是任何常量、变量或者可产生返回值的表达式
  4. 左边必须是一个明确的、已命名的变量
  5. 基本类型的赋值是直接复制;对象的赋值是赋予的该对象的引用
public class OperatorTest {
    public static void main(String[] args) {

        Student stu1 = new Student();
        Student stu2 = new Student();

        stu1.age = 10;
        stu2.age = 15;

        System.out.println("stu1: " + stu1.age + ", stu2: " + stu2.age);
        //赋值的是stu2的引用, 此时stu1和stu2指向同一个堆空间
        stu1 = stu2;
        System.out.println("stu1: " + stu1.age + ", stu2: " + stu2.age);
        stu1.age = 20;
        System.out.println("stu1: " + stu1.age + ", stu2: " + stu2.age);
    }
}

class Student {
    int age;
}

// result:
stu1: 10, stu2: 15
stu1: 15, stu2: 15
stu1: 20, stu2: 20

算术运算符

  1. Java中算术运算符包括 加号 +,减号 -,乘号 *,除号/(除号是将所有的小数都去掉) 以及取模%(从整数中获取余数)
public static void main(String[] args) {

    int a = 1, b = 2, c = 3, d = 4;
    int num1 = a + b * c - d / b;
    int num2 = (a + b) * (c - d) / b;
    System.out.println(num1 + " " + num2);

    num1 = c / b;
    System.out.println("c / b 的结果是: " + num1);

    num1 = c % d;
    System.out.println("c % d 的结果是: " + num1);
}

//结果是:
5 -1
c / b 的结果是: 1
c % d 的结果是: 3
  1. Java同样支持一元加减运算
//两个运算等价
x = -a;
x = (-a);

:虽然编译器能够自动解析运算,但是为了避免混淆同时提高代码的可读性,推荐使用括号写法

递增和递减

  1. 递增 ++ ,递减 –
int a = 1;
//以下两种表达形式等价
++a;
a = a +1;
  1. 递增和递减都有 前缀和后缀的区别
    前++(++a):先加后用——先执行递增再返回值
    后++(a++):先用后加——先返回值在执行递增
    前- - (- -a):先减后用——先执行递减再返回值
    后- - (a- -):先用后减——先返回值在执行递减
int a = 1;
System.out.println(a++);
System.out.println(++a);

// 结果是:
1
3

a = 1;
System.out.println(a--);
System.out.println(--a);

// 结果是:
1
-1

关系运算符

  1. 关系运算符会通过产生一个boolean值来表示操作数之间的关系。
    其中关系为真,返回true
    关系为假,返回false

  2. 运算符包括:<,>,<=,>=,==,!=
    : (1).包含大于、小于的运算符只能计算除boolean类型之外的其他基本数据类型
    (2). 比较运算符" ==" 不能误写成“=”, 否则报错

逻辑运算符

  1. 逻辑运算符是根据参数的逻辑关系生成boolean,包括:true或者false
  2. 逻辑运算符包括:&(逻辑与)、|(逻辑或)、!(逻辑非)、&&(短路与)、||(短路或)、^(逻辑异或)
int a = 10, b = 20;
System.out.println((a < 20) && (b < 20));
System.out.println((a < 20) || (b < 20));
System.out.println(!(a < 20));

//结果是:
false
true
false
  1. 逻辑运算符支持短路现象。
    表达式明确知道运算结果时就停止并返回结果,表达式后半部分不再执行
    ①. && (and):其中表达式全部为true则为true,有一个为false则为false同时后半部分不执行
    ②. || (or):其中表达式中全部为false则为false,有一个为true则为true同时后半部分不执行
public static void main(String[] args) {

        boolean value1 = test(1) && test(2) && test(3);
        System.out.println("当表达式全部为true时:" + value1);

//result:
value值:1
value值:2
value值:3
当表达式全部为true时:true

        boolean value2 = test(1) && test(4) && test(3);
        System.out.println("当表达式中第二部分为false时:" + value2);

//result:
value值为:1
value值为:4
当表达式中第二部分为false时:false

        boolean value3 = test(4) || test(5) || test(6);
        System.out.println("当表达式全部为false时:" + value3);

//result:        
value值为:4
value值为:5
value值为:6
当表达式全部为false时:false


        boolean value4 = test(4) || test(2) || test(6);
        System.out.println("当表达式中第二部分为true时:" + value4);

//result:
value值为:4
value值为:2
当表达式中第二部分为true时:true
    }


    public static boolean test(int value) {
        System.out.println("value值为:" + value);
        return value * value < 10;
    }
  1. 例:
    在a,b为不同的布尔值的时候,各逻辑运算符的结果为:在这里插入图片描述
  2. 运用短路的方式可以减少表达式的运算长度,提高程序性能。

位与移位运算符

  1. 位移运算符的运算对象是二进制’位’。
    在这里插入图片描述

  2. 右移位运算符直接对整数的二进制进行计算
    在这里插入图片描述

  3. 与、或、异或的例子
    在这里插入图片描述

三元运算符

  1. 三元运算符即为条件运算符
  2. 格式:boolean表达式? 值1: 值2;
    如果表达式为true则返回值1,否则返回值2
  3. 例:
    int a = 10;
    a = a < 15? a + 1 : a + 2;
    System.out.println(a);
    
    if (a < 15) {
        a = a + 1;
    } else {
        a = a + 2;
    }
    System.out.println(a);
    
    //result:
    11
    12
    
  4. :三元运算符使代码的可读性变差,尽量使用if-else语句表示

类型转换

  1. 我们经常需要将一种数值类型转换为另一种数据类型。
  2. 类型转换包括:自动类型转化和强制类型转换。

自动类型转换

  1. 自动类型转换:容量小的类型自动转换为容量大的类型
  2. 有多种类型的数据混合运算时:
    系统首先自动将所有数据转换成容量最大的那种数据类型,
    然后再进行计算。
  3. byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
  4. boolean类型不能与其它数据类型运算。
  5. 当把任何基本数据类型的值和字符串(String)进行连接运算时(+),
    基本数据类型的值将自动转化为字符串(String)类型。
    在这里插入图片描述
  6. 上图表示数据类型之间的转换
    实线箭头表示无信息丢失的转换
    虚线箭头表示有精度损失的转换
  7. 当使用两个不同数据类型进行二元操作时,需先将两个操作转换为同一种类型,再进行计算
    (1). 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型。
    (2). 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型。
    (3). 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
    (4). 否则,两个操作数都将被转换为int类型。

强制类型转换

  1. 使用 (cast) 实现强制类型转换

  2. 强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量

    double a = 2.82;
    int b = (int) a;
    int roundTest = (int) Math.round(a);
    System.out.println(b);
    System.out.println(roundTest);
    
    //result:
    2
    3
    
  3. 强制类型转换通过截断小数部分将浮点值转为整型。
    如果想对浮点值进行四舍五入计算,可以使用Math.round方法(返回值是long类型)

进制

概述

  1. 所有数字在计算机底层都是以二进制形势存在。
  2. 整数有四种表示方式在这里插入图片描述
  3. 常用数制的对应关系
    在这里插入图片描述

二进制

  1. Java整数常量默认是int类型;
    当用二进制表示int类型时,二进制位数为32bits,其中第32位是符号位
    当用二进制表示long类型时,二进制位数为64bits,其中第64位是符号位
    其中:最高位为0表示整数,最高位为1表示负数
  2. 计算机底层都是使用二进制表示整数
    计算机底层以二进制补码的形式保存所有的整数
  3. 正数的原码,反码,补码都相同
    原码:直接将一个数值换成二进制数,最高位是符号位
  4. 负数的反码:是对原码按位取反,最高位是符号位,仍然是1
    负数的补码:其反码+1
    在这里插入图片描述
  5. 计算机中减运算是作为加运算来操作的
    1-2 = 1 + (-2)
    第一步获得1和-2的补码
    第二步两个补码相加
    第三步将计算结果的补码转换成源码
    过程如下:
    在这里插入图片描述
    最终,计算结果为1+(-2) = -1*2^0=0

进制转换

十进制、二进制互相转换

  1. 十进制转换为二进制
    (1). 对于整数部分,用被除数反复除以2,除第一次外,依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位(1)。
    (2). 对于小数部分,采用连续乘以基数2,并依次取出的整数部分,直至结果的小数部分为0为止。故该法称“乘基取整法”。
    (3). 十进制数13转换为二进制,结果为:1101
    在这里插入图片描述
  2. 二进制转换为十进制
    (1). 二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……然后累加。
    (2). 公式: 第N位2N
    例:二进制:0B01101
    十进制:1 * 20+0 * 21+1 * 22+1 * 23=13

十进制与八进制互相转换

  1. 十进制数转换成八进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成8。
    (1). 十进制数120转换为八进制,结果为:170
    在这里插入图片描述
  2. 八进制转换为十进制与二进制转化为八进制相同。
    (1). 八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……
    (2). 公式: 第N位8N
    例: 1507换算成十进制
    7 * 80+ 0 * 81 + 5 * 82 + 1 * 83 = 839

十进制与十六进制互相转换

  1. 十进制数转换成十六进制的方法,和转换为二进制的方法类似,唯一变化:除数由2变成16。
    在这里插入图片描述
  2. 十六进制转换为十进制
    (1). 十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
    (2). 公式: 第N位16(N)
    例:2AF5换算成10进制:
    5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997

二进制与八进制相互转换

  1. 二进制转换为八进制
    (1). 从后往前每三位一组,缺位处用0填补,然后按十进制方法进行转化。
    例:11001 转换为八进制
    001=1 011=3
    二进制11001的八进制形式为:31
  2. 八进制转换为二进制
    (1). 从后往前每一位按十进制转化方式转化为三位二进制数,缺位处用0补充
    例:31转换为二进制
    1---->1---->001
    3---->11
    11001就是八进制31的二进制形式

二进制与十六进制的转换

  1. 十六进制与二进制的转换以4位为一组,需要快速迅心算出来,具体对应规则如下图
    在这里插入图片描述

    (1). 为了快速的将十六进制转换为二进制: 首先需要将十六进制准换位十进制,然后快速的转换为二进制
    2.如果遇到比较大的十进制数值需要转换为二进制,需要一直除以2,此时可以采用分治思想,先将大数值转换为十六进制,然后再快速转换为二进制
    :将十进制数1234转换为二进制数
    第一步:将十进制数转换为十六进制数 变为:0X4D2
    在这里插入图片描述
    第二步:将十六进制数转换为二进制数为:0B010011010010
    对映关系为:0100 = 4 1101 = D 0010 = 2

下一篇

0003.Java学习—控制流程
如有任何错误,请不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值