3

CGB2202二进制

 2 years ago
source link: https://blog.csdn.net/jason13579/article/details/123702164
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

CGB2202二进制

王克晶WKJ 已于 2022-03-24 17:28:43 修改 1528
  1. 正则表达式:
    • 描述字符串内容格式的,通常用它来匹配字符串内容是否符合要求
    • 正则表达式语法--------------了解
  2. String中与正则表达式相关的方法:
    • matches():使用给定正则表达式来验证当前字符串内容是否符合要求,符合返回true,不符合返回false
    • split():将当前字符串按照满足正则表达式的部分进行拆分,拆分为字符串数组
    • replaceAll():将当前字符串中满足正则表达式的部分替换为指定字符串,返回替换后的字符串
  3. Object:
    • 鼻祖,所有类都直接或间接继承了Object,万物皆对象
    • 其中有两个经常被重写的方法:toString()和equals()
      • Object中的toString()返回的是类的全称@地址,没有参考意义,所以常常重写toString()返回咱们自己需求的数据
      • Object中的equals()比较的还是对象的地址,没有参考意义,所以常常重写equals()来比较对象的属性
  4. 包装类:
    • 8种包装类,为了解决基本数据类型不能参与面向对象开发的问题
    • JDK1.5推出:自动拆装箱特性,允许基本类型与包装类之间直接赋值,底层将会自动补充代码完成转换工作
什么是2进制
  1. 逢二进一的计数规则

  2. 如何将2进制转换为10进制?

    • 将一个2进制数每个1位置的权值累加即可
  3. Java 所有的变量\常量存储的都是2进制数!

  4. 代码演示:

    public class Demo01 {
        public static void main(String[] args) {
            /*
             1.java在编译期间将10进制数编译为2进制数,按2进制来运算
                 .java(50) 编译后 .class(110010)
             2.Integer.toBinaryString()可以将底层的2进制数显示出来
             3.int类型是32位2进制数,显示2进制数时自动省略高位0
             4.System.out.println()将2进制转换为10进制输出
             */
            int n = 50; //110010
            System.out.println(Integer.toBinaryString(n)); //2进制
            n++; //110011
            System.out.println(n); //10进制
            System.out.println(Integer.toBinaryString(n)); //2进制
        }
    }
    
什么是16进制
  1. 逢16进1的计数规则
  2. 因为2进制的书写太繁琐麻烦
    00000000 00000000 00000000 00110010
    
    所以常常用16进制来缩写2进制数字
  3. 怎么缩写:将2进制从最低位开始,每4位2进制缩写为1位16进制
  4. 代码演示:
    public class Demo02 {
        public static void main(String[] args) {
            /*
              16进制:缩写2进制
               1)0x是16进制字面量前缀,0x开头则编译器按照16进制编译
               2)Java 7提供了2进制字面量前缀 0b----不用,一般都用16进制
             */
            int n = 0x4f057afe; //0x表示16进制
            int m = 0b1001111000001010111101011111110; //0b表示二进制
            System.out.println(Integer.toBinaryString(n)); //按2进制输出
            System.out.println(Integer.toBinaryString(m)); //按2进制输出
            //结论:用16进制来表示2进制更方便
    
            /*
             8进制:
             1)逢8进1的计数规则
             2)前缀0表示为8进制
             3)数字:0,1,2,3,4,5,6,7,没有7以上的数字
             */
            //----小面试题(8进制平时不用)
            //权     64 8 1
            int x =  067; //0开头表示8进制
            System.out.println(x); //十进制的55(6个8加上7个1)
    
        }
    }
    
  1. 计算机中处理有符号数(正负数)的一种编码方式,java中的补码最小类型是int,32位数

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

    • 计算的时候如果超出4位数就自动溢出舍弃,保持4位数不变
    • 将4位2进制数分一半作为负数使用
    • 最高位称为符号位,高位为1是负数,高位为0是正数
      int n = -3;
      System.out.println(Integer.toBinaryString(n));
      
      /*
      规律数:
      1)0111为4位补码的最大值,规律是1个0和3个1,可以推导出:
        32位补码的最大值,是1个0和31个1-----(011111111...)
      2)1000为4位补码的最小值,规律是1个1和3个0,可以推导出:
        32位补码的最小值,是1个1和31个0-----(100000000...)
      3)1111为4位补码的-1,规律是4个1,可以推导出:
        32位补码的-1是,是32个1------------(11111111...)
      */    
      int max = 2147483647; //int的最大值
      int min = -2147483648; //int的最小值
      System.out.println(Integer.toBinaryString(max)); //011111...
      System.out.println(Integer.toBinaryString(min)); //100000...
      System.out.println(Integer.toBinaryString(-1)); //11111...
      
      
  3. 深入理解负值:

    • 记住-1的编码是32个1
    • 用-1减去0位置对应的权值
      11111111111111111111111111111111 = -1
      11111111111111111111111111111101 = -1-2 = -3
      11111111111111111111111111111001 = -1-2-4 = -7
      11111111111111111111111110010111 = -1-8-32-64 = -105
      
  4. 互补对称:

    • 公式:-n=~n+1 结论:一个数的补码=这个数取反+1

    • 举例说明:

      int n = -3;
      int m = ~n+1;
      System.out.println(m); //3  -3的补码就是-3取反+1
      
    • System.out.println(~100+1); 上述代码的运算结果是(C)  注:求100的补码
      A. -98  B.-99 C.-100 D.-101
      System.out.println(~-100+1); 上述代码的运算结果是(C)  注:求-100的补码
      A.98  B.99  C.100  D.101
      
~ 取反
& 与运算
| 或运算
>>> 右移位运算
<< 左移位运算
  1. 基本规则:有0则0

    0 & 0 = 0
    0 & 1 = 0
    1 & 0 = 0
    1 & 1 = 1
    
  2. 运算的时候将两个数字对齐,将对应位进行与运算

    权                       8421
              6   1    4   f    7   b    b   b
    n  =      01100001 01001111 01111011 10111011
    m  =      00000000 00000000 00000000 11111111  0xff
    k  = n&m  00000000 00000000 00000000 10111011
    

    上述代码的用途:

    • 将n的最后8位拆分出来,存储到k中
    • m数称为掩码,8个1称为8位掩码
    • 上述运算称为:掩码运算
    int n = 0x614f7bbb;
    int m = 0xff; //掩码
    int k = n & m; //将n的最后8位数拆分出来,存储到k中
    System.out.println(Integer.toBinaryString(n));
    System.out.println(Integer.toBinaryString(m));
    System.out.println(Integer.toBinaryString(k));
    
  1. 基本规则:有1则1
    0 | 0 = 0
    0 | 1 = 1
    1 | 0 = 1
    1 | 1 = 1
    
  2. 运算的时候将两个数位对齐,对应的位进行或运算
    权                       8421
    n  =      00000000 00000000 00000000 10111001   0xb9
    m  =      00000000 00000000 10111101 00000000   0xbd00
    k  = n|m  00000000 00000000 10111101 10111001
    
    如上案例的意义:错位合并
    代码:
    int n = 0xb9;
    int m = 0xbd00;
    int k = n | m; //将n与m错位合并
    System.out.println(Integer.toBinaryString(n));
    System.out.println(Integer.toBinaryString(m));
    System.out.println(Integer.toBinaryString(k));
    
>>> 右移位运算
  1. 基本规则:将2进制数整体向右移动,低位自动溢出舍弃,高位补0
    权                      8421
               6   7    9   f    1   d    9   8
    n =        01100111 10011111 00011101 10011000
    m = n>>>1  001100111 10011111 00011101 1001100
    k = n>>>2  0001100111 10011111 00011101 100110
    g = n>>>8  00000000 01100111 10011111 00011101
    
  2. 代码:
    int n = 0x679f1d98;
    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));
    
<<左移位运算
  1. 基本规则:将2进制数整体向左移,高位溢出舍弃,低位补0
    权                        8421
                 5   e    4   e    0   d    e   e
    n =          01011110 01001110 00001101 11101110
    m = n<<1     1011110 01001110 00001101 111011100
    k = n<<2     011110 01001110 00001101 1110111000
    
  2. 代码
    int n = 0x5e4e0dee;  
    int m = n<<1;
    int k = n<<2;
    System.out.println(Integer.toBinaryString(n));
    System.out.println(Integer.toBinaryString(m));
    System.out.println(Integer.toBinaryString(k));
    
移位运算的数学意义
权    64  32  16  8  4  2  1
                  0  1  0  1 = 5      向左移动
              0   1  0  1    = 10
          0   1   0  1       = 20
      0   1   0   1          = 40

左移位代码:自行编码验证

int n = 5;
System.out.println(n<<1); //10
System.out.println(n<<2); //20
System.out.println(n<<3); //40

右移位代码:自行编码验证

int n = 100;
System.out.println(n>>>1); //?
System.out.println(n>>>2); //?
System.out.println(n>>>3); //?

精华笔记:

纯底层内容,要求尽量多的吸收,能吸收多少就吸收多少,吸收不了的就放弃

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

    • 2进制:
      • 规则:逢2进1
      • 数字:0 1
      • 权:128 64 32 16 8 4 2 1
    • 如何将2进制转换为10进制:
      • 将一个2进制数每个1位置的权值相加即可----------正数
  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进制
    • 计算机中处理有符号数(正负数)的一种编码方式,java中的补码最小类型是int,32位数
    • 以4位2进制为例讲解补码的编码规则:
      • 计算的时候如果超出4位数就自动溢出舍弃,保持4位数不变
      • 将4位2进制数分一半作为负数使用
      • 最高位称为符号位,高位为1是负数,高位为0是正数
    • 深入理解负值:
      • 记住-1的编码是32个1
      • 负值:用-1减去0位置对应的权值
    • 互补对称:
      • 结论:一个数的补码=这个数取反+1(取反+1) 公式: -n=~n+1
        6的补码=6取反+1
        -3的补码=-3取反+1
    System.out.println(~100+1);  前面代码的运算结果是(C):注:求100的补码
    A.-98  B:-99  C:-100  D:-101
    System.out.println(~-100+1); 前面代码的运算结果是(C): 注:求-100的补码
    A.98   B:99   C:100   D:101
    
    • ~:取反(0变1、1变0)
    • &:与运算(有0则0)
    • |:或运算(有1则1)
    • :右移位运算

    • <<:左移位运算
  1. 必须掌握的:
    • 什么是2进制
    • 什么是16进制、16进制存在的原因
    • 2进制与16进制之间的换算
权:       64  32  16  8  4  2  1
          1   1   0   0  1  0  0          = 100  右移位
              1   1   0  0  1  0          = 50
                  1   1  0  0  1          = 25
                      1  1  0  0          = 12 


权:       64  32  16  8  4  2  1
n                     0  1  0  1 = 5
m                  0  1  0  1    = 10
k             0    1  0  1       = 20

int n = 5;
int m = n<<2;
System.out.println(m); //20



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK