• java基础(2)--进制


    进制

    进制基础, 目的:理解计算机只能处理2进制的数据和指令

    1)10进制计数规律

      数字: 0 1 2 3 4 5 6 7 8 9

      基数:10

      权:  1000 100 10 1 权是基数的n次幂

    2)2进制计数规律

      数字: 0 1 

      基数:2

      权:  128 64 32 16 8 4 2 1 权是基数的n次幂

          (10)   (2)

          0      0

          1      1

          2     10

          3     11

          4    100

          5    101

          6    110

          7    111

          8   1000

          9   1001

         10   1010

         11   1011

         12   1100

         13   1101

         14   1110

         15   1111

      展开式:

      11001010(2) = 128+64+8+2 = 202(10)

        234(10) = ?(2)

                128 64 32 16 8 4 2 1

          234(10) =  1   1  1  0 1 0 1 0 (2)

                106 42 10    2   0

      

      二进制补码! 成本考虑, 为省钱!

      以4位补码为例

      1) 将高位为1的大数, 作为负数使用! 最高位称为符号位.

      2) 计算时候如果超过4位数, 多出数位自动溢出舍弃.

      3) 在不超过范围情况下, 补码运算满足数学规则

      4) 缺点 数字有范围, 不能进行超范围计算

      补码的取反对称现象: -n = ~n + 1

      符号位扩展现象: 低位数补码扩展为高位数补码: 正数补0 负数补1

      (10) 4位补   8位补            32位补码

      min            --------              10000000 00000000 00000000 00000000

                      8  0     0   0    0   0   0   0

       ...

     -129          --------              11111111 11111111 11111111 01111111

     -128   ----   10000000        11111111 11111111 11111111 10000000

     -127   ----   10000001

     -126   ----   10000010

      ....

     -10    ----   11110110

      -9    ----   11110111

      -8   1000   11111000

      -7   1001   11111001

      -6   1010   11111010

      -5   1011   11111011

      -4   1100   11111100

      -3   1101   11111101     11111111 11111111 11111111 11111101

      -2   1110   11111110     11111111 11111111 11111111 11111110

      -1   1111   11111111      11111111 11111111 11111111 11111111

       0   0000  00000000     00000000 00000000 00000000 00000000

       1   0001  00000001     00000000 00000000 00000000 00000001

       2   0010  00000010     00000000 00000000 00000000 00000010

       3   0011  00000011     00000000 00000000 00000000 00000011

       4   0100  00000100

       5   0101  00000101

       6   0110  00000110

       7   0111  00000111

       8   ----   00001000

       9   ----   00001001

      10   ----   00001010

      ...

      126  ----   01111110

      127  ----   01111111      00000000 00000000 00000000 01111111

      128  ----   --------        00000000 00000000 00000000 10000000

      129  ----          --------        00000000 00000000 00000000 10000001

      ....

      max  ----  --------             01111111 11111111 11111111 11111111

                              7   f    f   f    f   f    f   f      

    代码实现 输出-128到127的二进制:

    for(int i=-128;i<=127;i++){

      String bin=Integer.toBinaryString(i);

      int n=32-bin.length();

         for(int j=0;j<n;j++){

        System.out.print("0");

         }

      System.out.println(bin);

    }

      -3   1101

      -3   1101

    +     11 1    

    -------------

      -6   1010

    -5 的补码: -5 = ~5 + 1

       0101

       1010

       1011

         

    16 进制计数规律

     数字: 0 1 2 3 4 5 6 7 8 9 a b c d e f 

     基数:16

     权:  256 16 1

     权是基数的n次幂

     16进制用于简化2进制的书写!

     每4位2进制数据 可以简写为1位16进制数

     16进制就是2进制!

     10    16            2

      0    00    0000  0000

      1    01    0000  0001

      2    02    0000  0010

      3    03    0000  0011

      4    04    0000  0100

      5    05    0000  0101

      6    06    0000  0110

      7    07    0000  0111

      8    08    0000  1000

      9    09    0000  1001

     10    0a    0000  1010

     11    0b    0000  1011

     12    0c    0000  1100

     13    0d    0000  1101

     14    0e    0000  1110

     15    0f    0000  1111

     16    10    0001  0000

     17    11    0001  0001

     18    12    0001  0010

     ...

     65    41    0100  0001

     66    42    0100  0010

     ...

    192    c0    1100  0000

    193    c1    1100  0001

    ...

    255    ff    1111  1111

    System.out.println(010+2);//10

    进制的总结:

     1) 计算机只能处理 2 进制数据(经常是补码)!

     2) 计算机内部没有 10 进制 和 16进制

     3) 10进制是人类 处理数据的习惯,Java 利用API 提供算法(方法)实现 10进制的处理!

     4) 16 进制 是便捷的 2进制书写格式!

     5) 一切交给计算机的处理的数据,都要转换为2进制!

    原码  反码  补码

    1. 原码是指将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。例如:数字6在计算机中原码表示为:0000 0110。

      用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下:
              ( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
              (00000001) + (10000001) = (10000010) = ( -2 ) 显然不正确.

    2. 反码表示规则为:如果是正数,则表示方法和原码一样;如果是负数,则保留符号位1,然后将这个数字的原码按照每位取反,则得到这个数字的反码表示形式。

        例如,数字6在8位计算机中的反码就是它的原码:0000 0110  数字(-6)在8位计算机中的反码为:1111 1001

        因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:
               ( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10
               (00000001) + (11111110) = (11111111)  = ( -0 ) 有问题.
               ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10
               (00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正确

       问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个。

    3. 所以补码的设计目的是: 1)使符号位能与有效值部分一起参加运算,从而简化运算规则. 2)使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

  • 相关阅读:
    Mysql索引优化
    [ExtJS5学习笔记]第六节 Extjs的类系统Class System命名规则及定义和调试
    [ExtJS5学习笔记]第五节 使用fontawesome给你的extjs5应用增加字体图标
    【翻译】Ext JS 5.0.1 中的新功能
    OpenCV——PS图层混合算法(六)
    [IDE工具配置]myeclipse 2014 专业版 安装 svn插件
    OpenCV——PS 图层混合算法 (四)
    [ExtJS5学习笔记]第四节 欢迎来到extjs5-手把手教你实现你的第一个应用
    [ExtJS5学习笔记]第三节 sencha cmd学习笔记 生成应用程序构建的内部细节
    [ExtJS5学习笔记]第二节 Sencha Cmd 学习笔记 使你的sencha cmd跑起来
  • 原文地址:https://www.cnblogs.com/qin-derella/p/6542301.html
Copyright © 2020-2023  润新知