iOSBlog icon indicating copy to clipboard operation
iOSBlog copied to clipboard

计算机进制的基础知识

Open ChenYilong opened this issue 5 years ago • 1 comments

开篇先给大家讲个冷笑话, 暖场一下:

下面正式开始吧.

进制基础

在网上找到一个讲进制讲得比较清楚的视频, 分享给大家. 视频地址

分几个章节:

./
├── 01_进制基础知识
├── 02_R进制到十进制的转换
├── 03_十进制到R进制的转换
├── 04_进制间的快速转换
├── 05_Java内置的进制转换
├── 06_有符号数据表示法
├── 07_强制转换之数据溢出
├── 08_浮点数的进制转换
├── 09_浮点数存储
└── 10_浮点数的运算

里面的代码演示部分用的 Java. 也是较为简单的 Java 语法, 如果你对 Java 不太熟悉也能看懂.

PPT

06

代码

请点击“查看原文”查看

Demo1


/*
Demo1
   练习:在控制台输出下面的数据,看结果是多少
   0b10000000000
   02000
   0x400
*/
public class Demo01 {
   public static void main(String[] args) {
       System.out.println(0b10000000000);
       System.out.println(02000);
       System.out.println(0x400);
   }
}

Demo2

/*
   java.lang.Integer 类中的静态方法:

   public static String toBinaryString(int i):在基数2中返回整数参数的字符串表示形式为无符号整数
   public static String toOctalString(int i):在基数8中返回整数参数的字符串表示形式为无符号整数
   public static String toHexString(int i):返回整数参数的字符串表示形式,作为16位中的无符号整数

   public static String toString(int i,int radix):返回由第二个参数指定的基数中的第一个参数的字符串表示形式
*/
public class Demo02 {
   public static void main(String[] args) {
//        public static String toBinaryString(int i):在基数2中返回整数参数的字符串表示形式为无符号整数
       System.out.println(Integer.toBinaryString(42));
//        public static String toOctalString(int i):在基数8中返回整数参数的字符串表示形式为无符号整数
       System.out.println(Integer.toOctalString(42));
//        public static String toHexString(int i):返回整数参数的字符串表示形式,作为16位中的无符号整数
       System.out.println(Integer.toHexString(42));
       System.out.println("-------------------------------");

//        public static String toString(int i,int radix):返回由第二个参数指定的基数中的第一个参数的字符串表示形式
       System.out.println(Integer.toString(0b101010,10));
       System.out.println(Integer.toString(052,10));
       System.out.println(Integer.toString(0x2a,10));
       System.out.println(Integer.toString(0x2A,10));
   }
}

Demo3

/*
   请问下列代码是否有问题?如果有问题,如何解决呢?解决完毕之后,结果是多少呢?
   byte b = 130;
*/
public class Demo03 {
   public static void main(String[] args) {
       byte b = (byte)130;
       System.out.println(b);

       /*
           130默认是int类型的
           十进制的数据转为二进制数据:
           原码:00000000 00000000 00000000 10000010
           反码:00000000 00000000 00000000 10000010
           补码:00000000 00000000 00000000 10000010

           截取操作:
           补码:1 0000010
           反码:1 0000001
           原码:1 1111110

           64 + 32 + 16 + 8 + 4 + 2 = 126
           -126
        */
   }
}

Demo 4


import java.math.BigDecimal;

/*
   浮点数运算
*/
public class Demo04 {
   public static void main(String[] args) {
       System.out.println(2.0f - 1.5f);
       /*
           十进制:2.0
           二进制:10.0
           规范化表示:1.00000000000000000000000 * 2 ^ 1
           存储:
               符号:0
               M:00000000000000000000000
               E:1 + 127 = 128 = 10000000

               0 10000000 00000000000000000000000

           十进制:1.5
               0.5 * 2 = 1.0   1
           二进制:1.1
           规范化表示:1.10000000000000000000000 * 2 ^ 0
           存储:
               符号:0
               M:10000000000000000000000
               E:0 + 127 = 127 = 01111111

               0 01111111 10000000000000000000000

           计算:
               1.000000000000000000000000
               0.110000000000000000000000
               0.010000000000000000000000  * 2 ^ 1

               规范化表示:1.00000000000000000000000 * 2 ^ -1

           0.5的存储?
           十进制:0.5
               0.5 * 2 = 1.0   1
           二进制:0.1
           规范化表示:1.00000000000000000000000 * 2 ^ -1

           规范化表示:1.00000000000000000000000 * 2 ^ -1
        */
       System.out.println(2.0f - 1.3f);
       /*
           十进制:2.0
           二进制:10.0
           规范化表示:1.00000000000000000000000 * 2 ^ 1
           存储:
               符号:0
               M:00000000000000000000000
               E:1 + 127 = 128 = 10000000

               0 10000000 00000000000000000000000

           十进制:1.3
               0.3 * 2 = 0.6   0
               0.6 * 2 = 1.2   1
               0.2 * 2 = 0.4   0
               0.4 * 2 = 0.8   0
               0.8 * 2 = 1.6   1
               0.6 * 2 = 1.2   1
               0.2 * 2 = 0.4   0
               0.4 * 2 = 0.8   0
               0.8 * 2 = 1.6   1
               ...
           二进制:1.0100110011001100110011001
           规范化表示:1.01001100110011001100110 * 2 ^ 0
           存储:
               符号:0
               M:01001100110011001100110
               E:0 + 127 = 127 = 01111111

               0 01111111 01001100110011001100110

           计算:
               1.000000000000000000000000
               0.101001100110011001100110
               0.010110011001100110011010  * 2 ^ 1

               规范化表示:1.01100110011001100110100 * 2 ^ -1

           0.7的存储?
               十进制:0.7
                   0.7 * 2 = 1.4   1
                   0.4 * 2 = 0.8   0
                   0.8 * 2 = 1.6   1
                   0.6 * 2 = 1.2   1
                   0.2 * 2 = 0.4   0
                   0.4 * 2 = 0.8   0
                   0.8 * 2 = 1.6   1
                   0.6 * 2 = 1.2   1
                   0.2 * 2 = 0.4   0
                   ...
               二进制:0.1011001100110011001100110
               规范化表示:1.01100110011001100110011 * 2 ^ -1

               规范化表示:1.01100110011001100110100 * 2 ^ -1
        */
       System.out.println(2.0f - 1.4f);
       /*
           十进制:2.0
           二进制:10.0
           规范化表示:1.00000000000000000000000 * 2 ^ 1
           存储:
               符号:0
               M:00000000000000000000000
               E:1 + 127 = 128 = 10000000

               0 10000000 00000000000000000000000

           十进制:1.4
               0.4 * 2 = 0.8   0
               0.8 * 2 = 1.6   1
               0.6 * 2 = 1.2   1
               0.2 * 2 = 0.4   0
               0.4 * 2 = 0.8   0
               0.8 * 2 = 1.6   1
               0.6 * 2 = 1.2   1
               0.2 * 2 = 0.4   0
               ...
           二进制:1.011001100110011001100110
           规范化表示:1.01100110011001100110011 * 2 ^ 0
           存储:
               符号:0
               M:01100110011001100110011
               E:0 + 127 = 127 = 01111111

               0 01111111 01100110011001100110011

           计算:
               1.000000000000000000000000
               0.101100110011001100110011
               0.010011001100110011001101 * 2 ^ 1

               规范化表示:1.00110011001100110011010 * 2 ^ -1

           0.6的存储?
           十进制:0.6
               0.6 * 2 = 1.2   1
               0.2 * 2 = 0.4   0
               0.4 * 2 = 0.8   0
               0.8 * 2 = 1.6   1
               0.6 * 2 = 1.2   1
               0.2 * 2 = 0.4   0
               0.4 * 2 = 0.8   0
               0.8 * 2 = 1.6   1
               ...
           二进制:0.1001100110011001100110011001
           规范化表示:1.00110011001100110011010 * 2 ^ -1       0舍1入

           规范化表示:1.00110011001100110011010 * 2 ^ -1
        */
       /*
       0.5
       0.70000005
       0.6
        */

       BigDecimal bd1 = new BigDecimal("2.0");
       BigDecimal db2 = new BigDecimal("1.3");
       BigDecimal bd = bd1.subtract(db2);
       System.out.println(bd);
   }

ChenYilong avatar Apr 21 '20 17:04 ChenYilong