Java学习日记Day19

二进制学习

回顾:

  1. 正则表达式:描述字符串内容格式,通常用它来匹配字符串的内容是否符合格式要求
  2. String支持正则表达式的方法:
    • matches():检查是否匹配
    • split():拆分
    • replaceAll():替换
  3. Object:是所有类的鼻祖,所有类都直接或间接继承了Object,其中有两个经常被重写的方法:toString()和equals()
    • Object中的toString()返回格式为: 类的全称@地址,没有参考意义,所以常常重写toString()来返回对象的属性值
    • Object中的equals()内部比较的还是对象的地址是否相同,没有参考意义,所以常常重写equals()来比较对象的属性值是否相同。-----String类中重写equals()来比较字符串内容了
  4. 包装类:8个,给8种基本类型套了个壳,目的是为了解决基本类型不能直接参与面向对象开发的问题
    • 自动拆装箱,允许基本类型与引用类型之间直接赋值,底层会自动补充代码

精华笔记:

  1. 什么是2进制:逢2进1的计数规则。计算机中的变量/常量都是按照2进制来计算的。

    • 2进制:

      • 规则:逢2进1
      • 数字:0 1
      • 基数:2
      • 权:128 64 32 16 8 4 2 1
    • 如何将2进制转换为10进制:

      • 将一个2进制每个1位置的权相加即可--------正数

        权:    32  16  8  4  2  1
        二进制:  1   0  1  1  0  1
        十进制: 32+8+4+1=45
  2. 什么是16进制:逢16进1的计数规则

    • 16进制:

      • 规则:逢16进1
      • 数字:0 1 2 3 4 5 6 7 8 9 a b c d e f
      • 基数:16
      • 权:4096 256 16 1
    • 用途:因为2进制书写太麻烦,所以常常用16进制来缩写2进制

    • 如何缩写:将2进制从低位开始,每4位2进制缩为1个16进制(每4位1缩)

      权:                  8 4 2 1
      2进制:   0010  1001  0010  1101  1110  1111  0110  1000
      16进制:   2     9     2     d     e     f     6      8----292def68
      
      权:                  8 4 2 1
      2进制:  0001 1100 1010 0011 1101
      16进制:  1    c    a    3    d---------1ca3d
      
      权:                  8 4 2 1
      2进制:   0011 1010 1011 1010 1011
      16进制:   3    a    b    a    b--------3abab
  3. 补码:

    • 计算机处理有符号数(正负数)的一种编码方式

    • 以4位2进制为例讲解补码的编码规则:

      • 计算的时候如果超出4位则高位自动溢出舍弃,保持4位不变
      • 将4位2进制数分一半作为负数使用
      • 最高位称为符号位,高位为1是负数,高位为0是正数
    • 规律数:

      • 0111为4位补码的最大值,规律是1个0和3个1,可以推导出:
        • 32位补码的最大值:1个0和31个1------(011111111111......)
      • 1000为4位补码的最小值,规律是1个1和3个0,可以推导出:
        • 32位补码的最小值:1个1和31个0------(100000000000......)
      • 1111为4位补码的-1,规律是4个1,可以推导出:
        • 32位补码的-1:32个1--------(111111111111.....)
    • 深入理解负值:

      • 记住32位2进制数的-1的编码为:32个1

      • 用-1减去0位置对应的权----------负数

        1)11111111111111111111111111111111 = -1
        2)11111111111111111111111111111101 = -1-2= -3
        3)11111111111111111111111111111001 = -1-2-4= -7
        4)11111111111111111111111111111000 = -1-1-2-4= -8
        5)11111111111111111111111101101011 = -1-4-16-128= -149
        6)11111111111111111111111101101100 = -1-1-2-16-128 = -148
    • 互补对称现象:-n=~n+1-----取反+1

      -7    = 11111111111111111111111111111001 = -1-2-4=-1
      ~-7   = 00000000000000000000000000000110 = 2+4=6
      ~-7+1 = 00000000000000000000000000000111 = 1+2+4=7 
      
      5     = 00000000000000000000000000000101 = 1+4=5
      ~5    = 11111111111111111111111111111010 = -1-1-4=-6
      ~5+1  = 11111111111111111111111111111011 = -1-4=-5
      
      12    = 00000000000000000000000000001100 = 4+8=12
      ~12   = 11111111111111111111111111110011 = -1-4-8=-13
      ~12+1 = 11111111111111111111111111110100 = -1-1-2-8=-12
  4. 位运算:------------------------------了解

    • 取反:~

      • 0变1,1变0
    • 与运算:&

      • 运算规则:逻辑乘法,见0则0

        0 & 0 ---------> 0
        0 & 1 ---------> 0
        1 & 0 ---------> 0
        1 & 1 ---------> 1
    • 或运算:|

      • 运算规则:逻辑加法,见1则1,全0才0

        0 | 0 ----------> 0
        0 | 1 ----------> 1
        1 | 0 ----------> 1
        1 | 1 ----------> 1
    • 右移位运算:>>>

      • 运算规则:将2进制数整体向右移动,低位自动溢出舍弃,高位补0
    • 左移位运算:<<

      • 运算规则:将2进制数整体向左移动,高位自动溢出舍弃,低位补0
    • 移位运算的数学意义:

笔记:

  1. 什么是2进制:逢2进1的计数规则。计算机中的变量/常量都是按照2进制来计算的。

    • 2进制:

      • 规则:逢2进1
      • 数字:0 1
      • 基数:2
      • 权:128 64 32 16 8 4 2 1
    • 如何将2进制转换为10进制:

      • 将一个2进制每个1位置的权相加即可--------正数

        权:    32  16  8  4  2  1
        二进制:  1   0  1  1  0  1
        十进制: 32+8+4+1=45
        int n = 45; //编译时会将45编译为:101101
        System.out.println(Integer.toBinaryString(n)); //101101---以2进制输出
        System.out.println(n); //45---以10进制输出
        
        n++; //将101101增1----101110
        System.out.println(Integer.toBinaryString(n)); //101110---以2进制输出
        System.out.println(n); //46---以10进制输出
  2. 什么是16进制:逢16进1的计数规则

    • 16进制:

      • 规则:逢16进1
      • 数字:0 1 2 3 4 5 6 7 8 9 a b c d e f
      • 基数:16
      • 权:4096 256 16 1
    • 用途:因为2进制书写太麻烦,所以常常用16进制来缩写2进制

    • 如何缩写:将2进制从低位开始,每4位2进制缩为1个16进制(每4位1缩)

      权:                  8 4 2 1
      2进制:   0010  1001  0010  1101  1110  1111  0110  1000
      16进制:   2     9     2     d     e     f     6      8----292def68
      
      权:                  8 4 2 1
      2进制:  0001 1100 1010 0011 1101
      16进制:  1    c    a    3    d---------1ca3d
      
      权:                  8 4 2 1
      2进制:   0011 1010 1011 1010 1011
      16进制:   3    a    b    a    b--------3abab
      int n = 0x1ca3d; //0x表示16进制
      int m = 0b0001_1100_1010_0011_1101; //0b表示2进制
      System.out.println(Integer.toBinaryString(n)); //以2进制输出
      System.out.println(Integer.toBinaryString(m));
      System.out.println(n); //以10进制输出
      System.out.println(m);
      
      int a = 067; //以0开头表示8进制
      System.out.println(a); //55(6个8加上7个1---55)
  3. 补码:-----------------了解,尽量多的吸收

    • 计算机处理有符号数(正负数)的一种编码方式

    • 以4位2进制为例讲解补码的编码规则:

      • 计算的时候如果超出4位则高位自动溢出舍弃,保持4位不变
      • 将4位2进制数分一半作为负数使用
      • 最高位称为符号位,高位为1是负数,高位为0是正数
    • 规律数:

      • 0111为4位补码的最大值,规律是1个0和3个1,可以推导出:

        • 32位补码的最大值:1个0和31个1------(011111111111......)
      • 1000为4位补码的最小值,规律是1个1和3个0,可以推导出:

        • 32位补码的最小值:1个1和31个0------(100000000000......)
      • 1111为4位补码的-1,规律是4个1,可以推导出:

        • 32位补码的-1:32个1--------(111111111111.....)
        int max = Integer.MAX_VALUE; //int的最大值
        int min = Integer.MIN_VALUE; //int的最小值
        System.out.println(Integer.toBinaryString(max)); //01111111...
        System.out.println(Integer.toBinaryString(min)); //10000000...
        System.out.println(Integer.toBinaryString(-1)); //1111111...
    • 深入理解负值:

      • 记住32位2进制数的-1的编码为:32个1

      • 用-1减去0位置对应的权----------负数

        1)11111111111111111111111111111111 = -1
        2)11111111111111111111111111111101 = -1-2= -3
        3)11111111111111111111111111111001 = -1-2-4= -7
        4)11111111111111111111111111111000 = -1-1-2-4= -8
        5)11111111111111111111111101101011 = -1-4-16-128= -149
        6)11111111111111111111111101101100 = -1-1-2-16-128 = -148
        int n = -7;
        System.out.println(Integer.toBinaryString(n)); //以2进制输出
    • 互补对称现象:-n=~n+1-----取反+1

      -7    = 11111111111111111111111111111001 = -1-2-4=-1
      ~-7   = 00000000000000000000000000000110 = 2+4=6
      ~-7+1 = 00000000000000000000000000000111 = 1+2+4=7 
      
      5     = 00000000000000000000000000000101 = 1+4=5
      ~5    = 11111111111111111111111111111010 = -1-1-4=-6
      ~5+1  = 11111111111111111111111111111011 = -1-4=-5
      
      12    = 00000000000000000000000000001100 = 4+8=12
      ~12   = 11111111111111111111111111110011 = -1-4-8=-13
      ~12+1 = 11111111111111111111111111110100 = -1-1-2-8=-12
      //互补对称现象: -n=~n+1
      int m = -7;
      int o = ~m+1;
      System.out.println(o); //7
      int i = 12;
      int j = ~i+1;
      System.out.println(j); //-12
  4. 位运算:------------------------------了解

    • 取反:~

      • 0变1,1变0
    • 与运算:&

      • 运算规则:逻辑乘法,见0则0

        0 & 0 ---------> 0
        0 & 1 ---------> 0
        1 & 0 ---------> 0
        1 & 1 ---------> 1
                  1   7    9   d   5   d    9   e
        n =      00010111 10011101 01011101 10011110
        m =      00000000 00000000 00000000 11111111 0xff 8位掩码
        k = n&m  00000000 00000000 00000000 10011110
        
        int n = 0x179d5d9e;
        int m = 0xff; //8位掩码
        int k = n&m;
        System.out.println(Integer.toBinaryString(n));
        System.out.println(Integer.toBinaryString(m));
        System.out.println(Integer.toBinaryString(k));
        如上运算的意义:k中存储的是n的最后8位,这种运算叫做掩码运算
                   一般从低位开始1的个数称为掩码的位数
    • 或运算:|

      • 运算规则:逻辑加法,见1则1

        0 | 0 ----------> 0
        0 | 1 ----------> 1
        1 | 0 ----------> 1
        1 | 1 ----------> 1
        n =      00000000 00000000 00000000 11011101  0xdd
        m =      00000000 00000000 10011101 00000000  0x9d00
        k = n|m  00000000 00000000 10011101 11011101  0x9ddd
        
        int n = 0xdd;
        int m = 0x9d00;
        int k = n|m; //将n和m错位合并
        System.out.println(Integer.toBinaryString(n));
        System.out.println(Integer.toBinaryString(m));
        System.out.println(Integer.toBinaryString(k));
        如上运算的意义:两个数的错位合并
    • 右移位运算:>>>

      • 运算规则:将2进制数整体向右移动,低位自动溢出舍弃,高位补0

                   6    7  d   7   8   f   6   d
        n =        01100111110101111000111101101101
        m = n>>>1  00110011111010111100011110110110
        k = n>>>2  00011001111101011110001111011011
        g = n>>>8  00000000011001111101011110001111
        
        int n = 0x67d78f6d;
        int m = n>>>1;
        int k = n>>>2;
        int g = n>>>8;
        System.out.println(Integer.toBinaryString(n));
        System.out.println(Integer.toBinaryString(m));
        System.out.println(Integer.toBinaryString(k));
        System.out.println(Integer.toBinaryString(g));
    • 左移位运算:<<

      • 运算规则:将2进制数整体向左移动,高位自动溢出舍弃,低位补0

                   6    7  d   7   8   f   6   d
        n =        01100111110101111000111101101101
        m = n<<1   11001111101011110001111011011010
        k = n<<2   10011111010111100011110110110100
        g = n<<8   11010111100011110110110100000000
        
        int n = 0x67d78f6d;
        int m = n<<1;
        int k = n<<2;
        int g = n<<8;
        System.out.println(Integer.toBinaryString(n));
        System.out.println(Integer.toBinaryString(m));
        System.out.println(Integer.toBinaryString(k));
        System.out.println(Integer.toBinaryString(g));
    • 移位运算的数学意义:

      int n = 5;
      int m = n<<1;  //int m = n*2;
      int k = n<<2;
      int q = n<<3;
      System.out.println(m); //10
      System.out.println(k); //20
      System.out.println(q); //40
      /*
        权: 64  32  16  8  4  2  1
        n:              0  1  0  1 = 5
        m:          0   1  0  1    = 8+2=10
        k:      0   1   0  1       = 16+4=20
        q:  0   1   0   1          = 32+8=40
      */

补充:

  1. 二进制数看正负的时候,一定先把32位补全:

    • 补全后最高位为1表示负的,最高位为0表示正的
  2. 计算正数:将一个2进制数每个1位置的权相加即可

    计算负数:用-1减去0位置对应的权

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注摸鱼的汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值