首页 > 其他分享 >包装类&数学类&位运算

包装类&数学类&位运算

时间:2024-07-06 19:58:19浏览次数:1  
标签:运算 包装 数据类型 System 二进制 数学 println Math out

包装类&数学类&位运算

1 包装类

把基本数据类型包装成引用数据类型

byte short int long float double char boolean void
Byte Short Integer Long Float Double Character Boolean Void
  • Void

Void类构造方法是私有的,所以不能创建对象。并且Void是一个最终类,没有子类。

public static Void demo1(){
        return null;
   }
  • 数值类型(Byte Short Integer Long Float Double)

Number是数值类型共同的父类

自动装箱:自动把基本数据类型转换成引用数据类型,是jdk5的特性。底层调用对应类型的valueOf方法

Byte 在-128到127范围内,返回同一个对象

Short/Integer/Long 在-128 到127范围内,返回同一个对象。超出范围返回新的对象

Float/Double 永远返回新的对象

Character 在0-127范围内返回同一个对象,超出范围返回新对象

Boolean就返回两个对象。

  • 自动装箱
// 基本数据类型
        int i = 10;
        // 装箱:利用基本数据类型的变量来构建了对应的引用数据类型的对象
//        Integer integer = new Integer(i);
        // jdk5特性:自动装箱  自动把基本数据类型包装成引用数据类型
        // 自动装箱底层自动调用对应类身上的valueOf方法
        Integer integer = 10;
        System.out.println(integer);

        Double d = 3.14;

        Character c = 'a';

        Integer in1 = 98;
        Integer in2 = 98;
        System.out.println(in1 == in2);
  • 自动拆箱
// 拆箱:将引用数据类型的对象转换成基本数据类型
        // 自动拆箱:自动调用xxxValue()方法将引用数据类型转换成基本数据类型
//        int a = in.intValue();
        int a = in;
        
        Double dou = 3.14;
//        dou.doubleValue();
        
        char c1 = c;
        
        // 当引用数据类型的包装类和对应的基本数据类型进行运算时会自动拆箱
        if (in1 > 100){
            
        }
  • 把字符串转换成对应的基本数据类型
   // 把字符串转换成对应的基本数据类型  parseXxx("")
        double v = Double.parseDouble("3.14");
        int i1 = Integer.parseInt("2");
//        Byte.parseByte("");
//        Short.parseShort("")
//        Long.parseLong("")
//        Float.parseFloat("")
        System.out.println(Boolean.parseBoolean("True"));
  • 包装类的哈希值

包装类产生的对象的哈希码是固定不变的

null的哈希码规定是0

oct 八进制

bin 二进制
hex 十六进制

//        NaN not a number   非数字
        double d1= 0.0 / 0;
        double d2= 0.0 / 0;
        System.out.println(d1 == d2);
        // 判断是否是非数字
        System.out.println(Double.isNaN(d1));

        // 将十进制转换成十六进制
        String s = Integer.toHexString(15);
        // 将十进制转换成二进制
        String s1 = Integer.toBinaryString(3);
        // 将十进制转换成八进制
        String s2 = Integer.toOctalString(8);
        System.out.println(s2);
        System.out.println(s1);
        System.out.println(s);

2 数学类

  • Math
// 自然指数
        System.out.println(Math.E);
        // 圆周率
        System.out.println(Math.PI);

        // 求绝对值
        System.out.println(Math.abs(-3));
        // 求立方根
        System.out.println(Math.cbrt(27));
        // 向上取整
        System.out.println(Math.ceil(-3.4));
        // 向下取整
        System.out.println(Math.floor(-3.7));
        // 四舍五入
        System.out.println(Math.round(3.57));

        // 最大值
        System.out.println(Math.max(10,20));
        // 最小值
        System.out.println(Math.min(10,20));
        // 加权函数  a的b次方
        System.out.println(Math.pow(2,10));
        // 随机数  [0,1)
        System.out.println(Math.random());
        // 平方根
        System.out.println(Math.sqrt(16));
  • BigDecimal 用于精确计算的类。

需要精确计算时,要求参数以字符串形式传递,底层使用按位运算

    public static void main(String[] args) {
//        double d1 = 3.0;
//        double d2 = 2.99;
//        System.out.println(d1 - d2);
        BigDecimal bigDecimal1 = new BigDecimal("3.0");
        BigDecimal bigDecimal2 = new BigDecimal("1.5");
        // 加法
        System.out.println(bigDecimal1.add(bigDecimal2));
        // 减法
        System.out.println(bigDecimal1.subtract(bigDecimal2));
        // 乘法
        System.out.println(bigDecimal1.multiply(bigDecimal2));
        // 除法
        System.out.println(bigDecimal1.divide(bigDecimal2));
    }
  • BigInteger 用于存储和计算非常大的整数。
		// 大十进制  大量数字的存储和计算
        BigInteger bigInteger1 = new BigInteger("67555558");
        BigInteger bigInteger2 = new BigInteger("675555586358");
        System.out.println(bigInteger1.multiply(bigInteger2));
  • DecimalFormat 数字格式化
		double d = 100.09 * 0.85;
        System.out.println(d);
        // 创建对象并且指定数据显示格式
        // 用0代表占位,表示一位数字。如果没有数字,用0代替
//        DecimalFormat decimalFormat = new DecimalFormat("00.00");
        // # 代表占位,表示一位数字。如果这一位没有数字,那么就不填充
        // 0.#0 明显不符合常识,不能使用
//        DecimalFormat decimalFormat = new DecimalFormat("#0.00");
        // 科学计数法
        DecimalFormat decimalFormat = new DecimalFormat("0.000E0");
        System.out.println(decimalFormat.format(d));

3 位运算

3.1 进制

二进制: 0 - 1,满二进一 以0B开头作为标识 0b0101 0b0110

		int i = 0b00100;
        System.out.println(i);

八进制: 0 - 7 满八进一 07 015 以0开头作为标识

十进制:0 - 9 满十进一

十六进制: 0 -9 a - f 满15进1 以0x开头作为标识

  • 进制的相互转换

  • 十进制转二进制:

    • 不断除以2,取余数,把余数倒排
  • 二进制转十进制

    • 从低位次 起,按位次乘以2的位次次幂,然后求和
    1101 = 1 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 + 1 * 2 ^ 3 = 1 + 0 + 4 + 8 = 13
    
  • 十进制向哪个进制转换,就除以哪个进制,然后余数倒排

  • 二进制转八进制

    • 从低位次 起,每三位看作一组,产生一个八进制数字。最高位不足三位,补0.三位以内,按照二进制向十进制的转换规则进行运算,产生的八进制数字按顺序排序
     010  111  011 = 0273
    
  • 八进制转二进制

    • 每一位八进制转换成三位二进制的数字,然后按顺序排列
    273 = 10 111 011
    
  • 二进制转十六进制:四变一的过程

    • 111 1110 1101 = 0x7ed
      
  • 十六进制转二进制:一变四的过程

3.2 原码反码和补码

所有的数据在底层都是二进制数据的补码形式存储的

正数的原码反码和补码都一致

image-20240620152353216

3.3 位运算

位运算使用的前提是要把数据转成二进制数据的补码形式进行运算。运算效率更高。

  • 按位与 : & 两个位都是1,结果是1,否则结果就是0
    • 任意一个数 & 一个偶数,结果一定是偶数
    • 任意一个数 & 1,如果结果是0,就是一个偶数
  • 按位或: | 两个位只要有一个是1,那么结果就是1,否则就是0
    • 任意一个数 | 一个奇数,结果一定是奇数
    • 任意一个数 | 0 ,结果还是本身
  • 按位异或: ^ 两个位相同是0,不同是1
    • 任何数异或自身结果是0,异或0就是自身
        int a = 10;
        int b = 20;
//        int temp = a;
//        a = b;
//        b = temp;
//        a = a ^ b;
//        b = a ^ b;// a ^ b ^ b =  a
//        a = a ^ b;// a ^ b ^ a =  b
        a = b - a;
        b = b - a;// b - (b - a) = a
        a = b + a;// a + b - a = b

        System.out.println(a);
        System.out.println(b);
  • 左移: << 左边丢弃,右边补0 左移n位就是乘以2的n次方
   3 << 2
	0000 0011
    00 001100
       12
  • 右移: >> 右边丢弃,左边补位(正数补0,负数补1) 右移n位就是除以2的n次方
 5 >> 2
     00000101
     00000001
     1

课堂练习: -6 >> 2

 原码:  10000110
 反码:  11111001
 补码; 11111010
 右移之后的补码:      11111110
     反码: 11111101
     原码: 10000010
  • >>>  无符号右移  : 和右移类似  但是最高位一律补0
    
  • ~ 取反

    • 将数字转换成二进制后,1变0,0变1.最高位按照-128,其他位按照二进制转十进制的规则计算,然后加上-128

    • ~3 =  -4
          0000 0011
          1111 1100
          -128 + 64 + 32 + 16 + 8 + 4 =  - 4
      
    • ~i = -i - 1;

标签:运算,包装,数据类型,System,二进制,数学,println,Math,out
From: https://www.cnblogs.com/460759461-zeze/p/18287656

相关文章

  • Python运算符详细介绍
    在Python编程中,运算符是非常基础且重要的概念。它们用于执行各种运算操作。本文将详细介绍Python中的六种主要运算符:算数运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和成员运算符。1.算数运算符算数运算符用于执行基本的数学运算。以下是Python中常用的算数运算......
  • 【LeetCode:3101. 交替子数组计数 + 滑动窗口 + 数学公式】
    ......
  • 数学不好能搞人工智能吗?
    很遗憾,不能。人工智能(AI)实际上是一个将数学、算法理论和工程实践紧密结合的领域。AI 扒开来看就是算法,也就是数学、概率论、统计学、各种数学理论的体现。新的时代,程序员想要跨入AI之门,只要稍微花点时间研究一下AI的门道,就能知道,数学基础是第一个、也是最大的门槛。如果......
  • 七年级数学——有理数的基本概念(一)
    一.相反意义的量1.相反意义比如:海拔8848千米,海拔-340千米;向南走60米,向北走-100米。2.正数负数正数:0负数:00既不是负数也不是正数3.有理数正数和分数统称为有理数4.有理数的分类(1)按定义分(2)按符号分5.小数和分数......
  • C#学习—集合与运算符
    目录1.实现通用打印泛型类,可以打印各个集合中的值,方便调试2. 计算遍历目录的耗时        2.1使用Stopwatch                2.2 使用DateTime和DateTime.Now或DateTime.UtcNow3.有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位......
  • 2024年亚太中文赛数学建模竞赛B题 洪水灾害的数据分析与预测详细思路解析
    2024年亚太中文赛数学建模竞赛B题洪水灾害的数据分析与预测详细思路解析解题方法:首先就是对数据进行数据的预处理包括缺失值和异常值处理,之后就是分析哪些指标与洪水的发生有着密切的关联,可以使用相关性分析(建议使用斯皮尔曼相关系数法,斯皮尔曼相关系数是一种度量两个变量......
  • 组合数学
    定义与符号用\(n!\)表示\(n\)的阶乘;\(n^{\underlinek}\)表示其下降阶乘幂;\(n^{\overlinek}\)表示其上升阶乘幂。\(n!=1\times2\times...\timesn,n^{\underlinek}=n\times(n-1)\times...\times(n-k+1),n^{\overlinek}=n\times(n+1)\times...\times(n+k-1)\)用\(A_......
  • 2024 年第十四届 APMCM 亚太地区大学生数学建模A题 飞行器外形的优化问题--完整思路代
    飞行器是在大气层内或大气层外空间飞行的器。飞行器可以分为:航空器航天器、火箭和导弹。在大气层内飞行的称为航空器,如气球、飞艇、飞机等。它们靠空气的静浮力或空气相对运动产生的空气动力升空飞行。在太空飞行的称为航天器,如人造地球卫星、载人飞船、空间探测器、航天飞机......
  • 组合数学
    组合数学的常见式子递推式\[\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}\]证明(组合意义):同学和老师出去春游共有\(n\)个人,一项活动只能去\(m\)个人,考虑老师去或不去,老师去在\(n-1\)个同学中选\(m-1\)个,否则在\(n-1\)个同学中选\(m\)个。特征:加号连接,两......
  • P8453 「SWTR-8」美元巨大 (位运算+贪心)
    P8453「SWTR-8」美元巨大位运算+贪心因为\(a_i=2^{b_i}\),所以每一个符号只会影响一个二进制位,也就是二进制位是独立的。考虑经典的按位考虑,从高位到低位,我们希望高位尽可能取到\(1\)并且留下更好的符号让低位能更大。考虑贪心,显然|比^的价值更大,所以在答案不会变小的情......