精华内容
下载资源
问答
  • System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE); System.out.println("包装类:java.lang.Byte"); System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE); System.out.println(...
            // byte
            System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
            System.out.println("包装类:java.lang.Byte");
            System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
            System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
            System.out.println();
    
            // short
            System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
            System.out.println("包装类:java.lang.Short");
            System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
            System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
            System.out.println();
    
            // int
            System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
            System.out.println("包装类:java.lang.Integer");
            System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
            System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
            System.out.println();
    
            // long
            System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
            System.out.println("包装类:java.lang.Long");
            System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
            System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
            System.out.println();
    
            // float
            System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
            System.out.println("包装类:java.lang.Float");
            System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
            System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
            System.out.println();
    
            // double
            System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
            System.out.println("包装类:java.lang.Double");
            System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
            System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
            System.out.println();
    
            // char
            System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
            System.out.println("包装类:java.lang.Character");
            // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
            System.out.println("最小值:Character.MIN_VALUE="
                + (int) Character.MIN_VALUE);
            // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
            System.out.println("最大值:Character.MAX_VALUE="
                + (int) Character.MAX_VALUE);

    输出

    基本类型:byte 二进制位数:8
    包装类:java.lang.Byte
    最小值:Byte.MIN_VALUE=-128
    最大值:Byte.MAX_VALUE=127
    
    基本类型:short 二进制位数:16
    包装类:java.lang.Short
    最小值:Short.MIN_VALUE=-32768
    最大值:Short.MAX_VALUE=32767
    
    基本类型:int 二进制位数:32
    包装类:java.lang.Integer
    最小值:Integer.MIN_VALUE=-2147483648
    最大值:Integer.MAX_VALUE=2147483647
    
    基本类型:long 二进制位数:64
    包装类:java.lang.Long
    最小值:Long.MIN_VALUE=-9223372036854775808
    最大值:Long.MAX_VALUE=9223372036854775807
    
    基本类型:float 二进制位数:32
    包装类:java.lang.Float
    最小值:Float.MIN_VALUE=1.4E-45
    最大值:Float.MAX_VALUE=3.4028235E38
    
    基本类型:double 二进制位数:64
    包装类:java.lang.Double
    最小值:Double.MIN_VALUE=4.9E-324
    最大值:Double.MAX_VALUE=1.7976931348623157E308
    
    基本类型:char 二进制位数:16
    包装类:java.lang.Character
    最小值:Character.MIN_VALUE=0
    最大值:Character.MAX_VALUE=65535

     

    展开全文
  • 八位二进制补码最小值8位二进制补码表示整数的最小值是 -128, 最大值是 +127.原因:正数的补码就是其本身,8位二进制最大正整数是 0111111,也就是十进制值 127。负数的补码是它原数的反码加1,最小值...

    好吧,小编虽然上个C++语言和VB语言基础,虽然那个爱笑的从国外留学回来的老师讲课很好很精彩,但无奈小编跟不上呀。所以下面是学习啦小编给大家总结的八位二进制补码最小值和二进制补码知识点。

    八位二进制补码最小值

    8位二进制补码表示整数的最小值是 -128, 最大值是 +127.

    原因:正数的补码就是其本身,8位二进制最大正整数是 0111111,也就是十进制值 127。

    负数的补码是它原数的反码加1,最小值,就是负得最多的数,

    即二进制 1000 0000。十进制-128。

    推导: -128 =(-1)+(-127) = 原码 1000 0001+原码 1111 1111 =

    补码 1111 1111 + 补码 1000 0001 = 补码 1000 0000。

    什么是二进制的补码?

    注明:正数的补码与负数的补码一致,负数的补码符号位为1,这位1即是符号位也是数值位,然后加1

    补码借鉴的模概念,虽然理解起来有点晦涩难懂。可以跳过

    模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。

    在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为16),因此它的运算也是一种模运算。当计数器计满16位也就是65536个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,16位二进制数,它的模数为2^16=65536。在计算中,两个互补的数称为“补码”。比如一个有符号8位的数可以表示256个数据,最大数是0 1 1 1 1 1 1 1(+127),最小数1 0 0 0 0 0 0 0 (-128);那么第255个数据,加2和减254都是一样的效果得出的结果是第一个数据 ,所以2和254是一样的效果。对于255来说2和254是互补的数。

    求一个正数对应补码是一种数值的转换方法,要分二步完成:

    第一步,每一个二进制位都取相反值,即取得反码;0变成1,1变成0。比如,00001000的反码就是11110111。

    第二步,将上一步得到的反码加1。11110111就变成11111000。所以,00001000的二进制补码就是11111000。也就是说,-8在计算机(8位机)中就是用11111000表示。

    不知道你怎么看,反正我觉得很奇怪,为什么要采用这么麻烦的方式表示负数,更直觉的方式难道不好吗?

    二进制补码的好处

    首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种用的爽直观方便的方式。

    二进制的补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。

    还是以-8作为例子。假定有两种表示方法。一种是直觉表示法,即10001000;另一种是2的补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?随便写一个计算式,16 + (-8) = ?16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:

    00010000

    +10001000原码形式-8

    ---------

    10011000

    可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。所以用原码表示负数是不行的。

    现在,再来看二进制的补码表示法。

    00010000

    +11111000补码形式-8

    ---------

    100001000

    可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。(特别说明,有部分素材来自博主JQ_AK47)

    展开全文
  • 利用遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)f(x) =x+10sin(5x)+7cos(4x)的最大值

    问题描述

    求函数 f(x)=x+10sin(5x)+7cos(4x) 的最大值,其中 x 的取值范围是[0,10]

    该函数有多个局部极值

    f(x)=x+10sin(5x)+7cos(4x)


    Matlab遗传算法代码


    • 采用二进制编码
    • 轮盘赌选择法

    脚本

    初始化参数

    clear all;      %清除所有变量
    close all;      %清图
    clc;            %清屏
    NP=50;          %种群数量,一般取10~200,即染色体数目,将定义域划分50个(不等距)
    L=20;           %二进制位串长度,即染色体上基因数目,和计算要求的精度有关,如
                    %精10^-5,则2^19<10*10^5<2^20,至少需要20位
    Pc=0.8;         %交叉率,一般取0.25~1
    Pm=0.1;         %变异率,一般取0.001~0.1
    G=100;          %最大遗传代数,一般100~1000
    Xs=10;          %定义域上限
    Xx=0;           %定义域下限
    f=randi([0,1],NP,L);  %随机获得初始种群
    trace=zeros(1,G);     %预先分配内存

    解码

         for i=1:NP
            U=f(i,:);               %一条染色体
            m=0;
            for j=1:L
                m=U(j)*2^(j-1)+m;       %二进制转十进制的过程
            end
            x(i)=Xx+m*(Xs-Xx)/(2^L-1);  %将染色体解码在函数定义域
            Fit(i)=func1(x(i));         %适应度,即目标函数值   
        end

    求适应度最优

        maxFit=max(Fit);            %适应度最优
        minFit=min(Fit);            %适应度最差
        rr=find(Fit==maxFit);      
        %最大值在Fit数组中的位置,返回一个数组,因为可能有几个相同的最大值
        %这点要特别注意,所以下面不能直接用rr
        fBest=f(rr(1,1),:);         %最优适应度,有多个相同值时只取第一个
        xBest=x(rr(1,1));           %最优适应度对应的染色体
        Fit=(Fit-minFit)/(maxFit-minFit);   %归一化适应度值

    在本代挑选交配的父母染色体

    sum_Fit=sum(Fit);
        fitvalue=Fit./sum_Fit;      %可以看作概率密度f
        fitvalue=cumsum(fitvalue);  %可以看作概率累计F
        ms=sort(rand(NP,1));        %随机生成(0,1)的升序概率密度NP向量
        fiti=1;
        newi=1;
        %由ms可以看出这是一种随机的复制方式,但总趋势是将适应度比较大的遗传下去
            while newi <=NP   %父母双方以同样的方式挑选
            if (ms(newi)<fitvalue(fiti))
                nf(newi,:)=f(fiti,:);
                newi=newi+1;
            else
                fiti=fiti+1;
            end
        end

    随机交叉

     for i=1:2:NP
            p=rand;
            if p<Pc                     %控制交叉的染色体总数
                q=randi([0,1],1,L);     %随机生成要交叉的基因位置  
                for j=1:L
                    if q(j)==1
                        temp=nf(i+1,j);
                        nf(i+1,j)=nf(i,j);
                        nf(i,j)=temp;   %父母染色体在指定位置进行交叉
                    end
                end
            end
        end

    变异操作

        i=1;
        while i<=round(NP*Pm)       %控制变异染色体总数
            h=randi([1,NP],1,1);    %随机选取一个染色体
            for j=1:round(L*Pm)     %控制染色体上变异基因总数
                g=randi([1,L],1,1); %随机选取一个基因进行变异
                nf(h,g)=~nf(h,g);   %变异,即取反
            end
            i=i+1;
        end

    完整代码

    %%%%%标准遗传算法求函数极值%%%%
    %%%%%初始化参数%%%%%
    clear all;      %清除所有变量
    close all;      %清图
    clc;            %清屏
    NP=50;          %种群数量,一般取10~200,即染色体数目,将定义域划分50个(不等距)
    L=20;           %二进制位串长度,即染色体上基因数目,和计算要求的精度有关,如
                    %精度10^-5,则2^19<10*10^5<2^20,至少需要20Pc=0.8;         %交叉率,一般取0.25~1
    Pm=0.1;         %变异率,一般取0.001~0.1
    G=100;          %最大遗传代数,一般100~1000
    Xs=10;          %定义域上限
    Xx=0;           %定义域下限
    f=randi([0,1],NP,L);  %随机获得初始种群
    trace=zeros(1,G);     %预先分配内存
    %%%%%%%%遗传算法循环%%%%%%%%
    for k=1:G
      %%%%%%解码%%%%
        for i=1:NP
            U=f(i,:);               %一条染色体
            m=0;
            for j=1:L
                m=U(j)*2^(j-1)+m;       %二进制转十进制的过程
            end
            x(i)=Xx+m*(Xs-Xx)/(2^L-1);  %将染色体解码在函数定义域
            Fit(i)=func1(x(i));         %适应度,即目标函数值   
        end
        %%%%%%求适应度最优%%%%
        maxFit=max(Fit);            %目标函数最大值
        minFit=min(Fit);            %目标函数最小值
        rr=find(Fit==maxFit);      
        %最大值在Fit数组中的位置,返回一个数组,因为可能有几个相同的最大值
        %这点要特别注意,所以下面不能直接用rr
        fBest=f(rr(1,1),:);         %最优适应度,有多个相同值时只取第一个
        xBest=x(rr(1,1));           %最优适应度对应的染色体
        Fit=(Fit-minFit)/(maxFit-minFit);   %归一化适应度值
        %%%%%至此本代最优已筛选出来,下面开始为下一代作准备%%%%
        %%%%%基于轮盘赌的复制操作,在本代挑选出交配的父母双方%%%%
        sum_Fit=sum(Fit);
        fitvalue=Fit./sum_Fit;      %可以看作概率密度f
        fitvalue=cumsum(fitvalue);  %可以看作概率累计F
        ms=sort(rand(NP,1));        %随机生成(0,1)的有序概率密度NP大小向量
        fiti=1;
        newi=1;
        %由ms可以看出这是一种随机的复制方式,但总趋势是将适应度比较大的遗传下去
        while newi <=NP
            if (ms(newi)<fitvalue(fiti))
                nf(newi,:)=f(fiti,:);
                newi=newi+1;
            else
                fiti=fiti+1;
            end
        end
        %%%%%%%%基于概率的交叉操作%%%%%%%%
        for i=1:2:NP
            p=rand;
            if p<Pc                     %控制交叉的染色体总数
                q=randi([0,1],1,L);     %随机生成要交叉的基因位置  
                for j=1:L
                    if q(j)==1
                        temp=nf(i+1,j);
                        nf(i+1,j)=nf(i,j);
                        nf(i,j)=temp;   %两条相邻染色体在指定位置进行交叉
                    end
                end
            end
        end
        %%%%%%%%%基于概率的变异操作%%%%%%%%%%%%
        i=1;
        while i<=round(NP*Pm)       %控制变异染色体总数
            h=randi([1,NP],1,1);    %随机选取一个染色体进行变异
            for j=1:round(L*Pm)     %控制染色体上变异基因总数
                g=randi([1,L],1,1); %随机选取一个基因进行变异
                nf(h,g)=~nf(h,g);   %变异,即取反
            end
            i=i+1;
        end
        f=nf;                    %新一代种群                   
        f(1,:)=fBest;            %保留最优个体在新种群中
        trace(k)=maxFit;         %历代最优是应当由,即最大函数值
    end
    disp('最优解');
    disp(xBest);                 %最优个体,也就是最优解
    figure
    plot(trace)
    xlabel('迭代次数')
    ylabel('目标函数值')
    title('适应度进化曲线')

    函数

    function fit=func1(x)
    fit=x+10*sin(5*x)+7*cos(4*x);
    end

    计算结果

    函数最大值出现在 x=7.86 附近,约为24.86


    这里写图片描述

    展开全文
  • 二进制

    2013-07-01 14:56:47
    二进制 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统...

    二进制

    二进制是计算技术中广泛采用的一种数制二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统  

    编辑本段简介

      20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是二进制,同时证明了莱布尼兹的原理是正确的。

    编辑本段进制数

      二进制数据的表示法

      二进制数据也是采用位置计数法,其位权是以2为底的。例如二进制数据110.11,其权的大小顺序为2^2、2^1、2^0、2^-1、2^-2。对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为:

      (a(n-1)a(n-2)…a(-m))2=a(n-1)×2^(n-1)+a(n-2)×2^(n-2)+……+a(1)×2^1+a(0)×2^0+a(-1)×2^(-1)+a(-2)×2^(-2)+……+a(-m)×2^(-m)

      二进制数据一般可写为:(a(n-1)a(n-2)…a(1)a(0).a(-1)a(-2)…a(-m))2。

      注意:

      1.式中aj表示第j位的系数,它为0和1中的某一个数。

      2.a(n-1)中的(n-1)为下标,输入法无法打出所以用括号括住,避免混淆。

      3.2^2表示2的平方,以此类推。

      【例1102】将二进制数据111.01写成加权系数的形式。

      解:(111.01)2=(1×2^2)+(1×2^1)+(1×2^0)+(0×2^-1)+(1×2^-2)

      二进制和十六进制,八进制一样,都以二的幂来进位的。

    编辑本段二进制运算

      二进制数据的算术运算的基本规律和十进制数的运算十分相似。最常用的是加法运算和乘法运算。

         

    1. 二进制加法

      有四种情况: 0+0=0

      0+1=1

      1+0=1

      1+1=10 进位为1

      【例1103】求 (1101)2+(1011)2 的和

      解:

      ??1 1 0 1

      + ?1 0 1 1

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

      ?1 1 0 0 0

    2. 二进制乘法

      有四种情况: 0×0=0

      1×0=0

      0×1=0

      1×1=1

      【例1104】求 (1110)2 乘(101)2 之积

      解:

      ???1 1 1 0

      × ?? 1 0 1

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

      ??? 1 1 1 0

      ?? 0 0 0 0

      ?1 1 1 0

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

      1 0 0 0 1 1 0

      (这些计算就跟十进制的加或者乘法相同,只是进位的数不一样而已,十进制的是到十才进位这里是到2就进了)

      3.二进制减法

      0-0=0,1-0=1,1-1=0,10-1=1。

      4.二进制除法

      0÷1=0,1÷1=1。[1][2]

      5.二进制拈加法

      拈加法二进制加减乘除外的一种特殊算法。

      拈加法运算与进行加法类似,但不需要做进位。此算法在博弈论(Game Theory)中被广泛利用。

    编辑本段进制转换

      十进制数转换为二进制数、八进制数、十六进制数的方法:

      二进制数、八进制数、十六进制数转换为十进制数的方法:按权展开求和法

    1.二进制与十进制间的相互转换:

      (1)二进制转十进制

      方法:“按权展开求和”

      例: (1011.01)2 =(1×2^3+0×2^2+1×2^1+1×2^0+0×2^(-1)+1×2^(-2) )10

      =(8+0+2+1+0+0.25)10

      =(11.25)10

      规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依奖递增,而十

      分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。

      注意:不是任何一个十进制小数都能转换成有限位的二进制数。

      (2)十进制转二进制

      · 十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)

      例: (89)10 =(1011001)2

      89÷2 ……1

      44÷2 ……0

      22÷2 ……0

      11÷2 ……1

      5÷2 ……1

      2÷2 ……0

      1

      · 十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)

      例: (0.625)10= (0.101)2

      0.625X2=1.25 ……1

      0.25 X2=0.50 ……0

      0.50 X2=1.00 ……1

    2.八进制与二进制的转换:

      二进制数转换成八进制数:从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制数的数字表示,不足3位的要用“0”补足3位,就得到一个八进制数。

      八进制数转换成二进制数:把每一个八进制数转换成3位的二进制数,就得到一个二进制数。

      八进制数字与二进制数字对应关系如下:

      000 -> 0 100 -> 4

      001 -> 1 101 -> 5

      010 -> 2 110 -> 6

      011 -> 3 111 -> 7

      例:将八进制的37.416转换成二进制数:

      3 7 . 4 1 6

      011 111 .100 001 110

      即:(37.416)8 =(11111.10000111)2

      例:将二进制的10110.0011 转换成八进制:

      0 1 0 1 1 0 . 0 0 1 1 0 0

      2 6 . 1 4

      即:(10110.011)2 = (26.14)8

    3.十六进制与二进制的转换:

      二进制数转换成十六进制数:从小数点开始,整数部分向左、小数部分向右,每4位为一组用一位十六进制数的数字表示,不足4位的要用“0”补足4位,就得到一个十六进制数。

      十六进制数转换成二进制数:把每一个十六进制数转换成4位的二进制数,就得到一个二进制数。

      十六进制数字与二进制数字的对应关系如下:

      0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C

      0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D

      0010 -> 2 0110 -> 6 1010 -> A 1110 -> E

      0011 -> 3 0111 -> 7 1011 -> B 1111 -> F

      例:将十六进制数5DF.9 转换成二进制:

      5 D F . 9

      0101 1101 1111 .1001

      即:(5DF.9)16 =(10111011111.1001)2

      例:将二进制数1100001.111 转换成十六进制:

      0110 0001 . 1110

      6 1 . E

      即:(1100001.111)2 =(61.E)16

    编辑本段二进制的特点

    优点

      数字装置简单可靠,所用元件少;

      只有两个数码0和1,因此它的每一位数都可用任何具有两个不同稳定状态的元件来表示; 9

      基本运算规则简单,运算操作方便。

    缺点

      用二进制表示一个数时,位数多。因此实际使用中多采用送入数字系统前用十进制,送入机器后再转换成二进制数,让数字系统进行运算,运算结束后再将二进制转换为十进制供人们阅读。

      二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。

      我们也一样,只要学完这一小节,就能做到。

      首先我们来看一个二进制数:1111,它是多少呢?

      你可能还要这样计算:1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1 * 2^3 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。

      然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为2^3 = 8,然后依次是 2^2 = 4,2^1=2, 2^0 = 1。

      记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。

      下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)

      仅4位的2进制数 快速计算方法 十进制值 十六进值

      1111 = 8 + 4 + 2 + 1 = 15 F

      1110 = 8 + 4 + 2 + 0 = 14 E

      1101 = 8 + 4 + 0 + 1 = 13 D

      1100 = 8 + 4 + 0 + 0 = 12 C

      1011 = 8 + 0 + 2+ 1 = 11 B

      1010 = 8 + 0 + 2 + 0 = 10 A

      1001 = 8 + 0 + 0 + 1 = 9 9

      ....

      0001 = 0 + 0 + 0 + 1 = 1 1

      0000 = 0 + 0 + 0 + 0 = 0 0

      二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

      如(上行为二制数,下面为对应的十六进制):

      1111 1101 , 1010 0101 , 1001 1011

      F D , A 5 , 9 B

      反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?

      先转换F:

      看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。

      接着转换 D:

      看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。

      所以,FD转换为二进制数,为: 1111 1101

      由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。

      比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:

      被除数 计算过程 商 余数

      1234 1234/16 77 2

      77 77/16 4 13 (D)

      4 4/16 0 4

      结果16进制为: 0x4D2

      然后我们可直接写出0x4D2的二进制形式: 0100 1101 0010。

      其中对映关系为:

      0100 -- 4

      1101 -- D

      0010 -- 2

      同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。

      下面举例一个int类型的二进制数:

      01101101 11100101 10101111 00011011

      我们按四位一组转换为16进制: 6D E5 AF 1B

    原码、补码和反码

    (1)原码表示法

    原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作〔x〕原。

    例如,X1= +1010110

    X2= 一1001010

    其原码记作:

    〔X1〕原=[+1010110]原=01010110

    〔X2〕原=[-1001010]原=11001010

    原码表示数的范围与二进制位数有关。当用8位二进制来表示小数原码时,其表示范围:

    最大值为0.1111111,其真值约为(0.99)10

    最小值为1.1111111,其真值约为(一0.99)10

    当用8位二进制来表示整数原码时,其表示范围:

    最大值为01111111,其真值为(127)10

    最小值为11111111,其真值为(-127)10

    在原码表示法中,对0有两种表示形式:

    〔+0〕原=00000000

    [-0] 原=10000000

    (2)补码表示法

    机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作〔X〕补。

    例如,[X1]=+1010110

    [X2]= 一1001010

    [X1]原=01010110

    [X1]补=01010110

    即 [X1]原=[X1]补=01010110

    [X2] 原= 11001010

    [X2] 补=10110101+1=10110110

    补码表示数的范围与二进制位数有关。当采用8位二进制表示时,小数补码的表示范围:

    最大为0.1111111,其真值为(0.99)10

    最小为1.0000000,其真值为(一1)10

    采用8位二进制表示时,整数补码的表示范围:

    最大为01111111,其真值为(127)10

    最小为10000000,其真值为(一128)10

    在补码表示法中,0只有一种表示形式:

    [+0]补=00000000

    [+0]补=11111111+1=00000000(由于受设备字长的限制,最后的进位丢失)

    所以有[+0]补=[+0]补=00000000

    (3)反码表示法

    机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作〔X〕反

    例如:X1= +1010110

    X2= 一1001010

    〔X1〕原=01010110

    [X1]反=〔X1〕原=01010110

    [X2]原=11001010

    [X2]反=10110101

    反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。

    例1. 已知[X]原=10011010,求[X]补。

    分析如下:

    由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到。现给定的机器数为负数,故有[X]补=[X]原十1,即

    [X]原=10011010

    [X]反=11100101

    十)      1

    [X]补=11100110

    例2. 已知[X]补=11100110,求〔X〕原。

    分析如下:

    对于机器数为正数,则〔X〕原=〔X〕补

    对于机器数为负数,则有〔X〕原=〔〔X〕补〕补

    现给定的为负数,故有:

    〔X〕补=11100110

    〔〔X〕补〕反=10011001

    十) 1

    〔〔X〕补〕补=10011010=〔X〕原

    或者说:

    数在计算机中是以二进制形式表示的。

    数分为有符号数和无符号数。

    原码、反码、补码都是有符号定点数的表示方法。

    一个有符号定点数的最高位为符号位,0是正,1是副。

    以下都以8位整数为例,

    原码就是这个数本身的二进制形式。

    例如

    0000001 就是+1

    1000001 就是-1

    正数的反码和补码都是和原码相同。

    负数的反码是将其原码除符号位之外的各位求反

    [-3]反=[10000011]反=11111100

    负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。

    [-3]补=[10000011]补=11111101

    一个数和它的补码是可逆的。

    为什么要设立补码呢?

    第一是为了能让计算机执行减法:

    [a-b]补=a补+(-b)补

    第二个原因是为了统一正0和负0

    正零:00000000

    负零:10000000

    这两个数其实都是0,但他们的原码却有不同的表示。

    但是他们的补码是一样的,都是00000000

    特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)

    [10000000]补

    =[10000000]反+1

    =11111111+1

    =(1)00000000

    =00000000(最高位溢出了,符号位变成了0)

     

    有人会问

    10000000这个补码表示的哪个数的补码呢?

    其实这是一个规定,这个数表示的是-128

    所以n位补码能表示的范围是

    -2^(n-1)到2^(n-1)-1

    比n位原码能表示的数多一个

    又例:

    1011

    原码:01011

    反码:01011 //正数时,反码=原码

    补码:01011 //正数时,补码=原码

    -1011

    原码:11011

    反码:10100 //负数时,反码为原码取反

    补码:10101 //负数时,补码为原码取反+1

    0.1101

    原码:0.1101

    反码:0.1101 //正数时,反码=原码

    补码:0.1101 //正数时,补码=原码

    -0.1101

    原码:1.1101

    反码:1.0010 //负数时,反码为原码取反

    补码:1.0011 //负数时,补码为原码取反+1

    在计算机内,定点数有3种表示法:原码、反码和补码

    所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

    反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

    补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

    假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:

      00000000 00000000 00000000 00000101

      5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。

      现在想知道,-5在计算机中如何表示?

      在计算机中,负数以其正值的补码形式表达。

      什么叫补码呢?这得从原码,反码说起。

      原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

      比如 00000000 00000000 00000000 00000101 是 5的 原码。

      反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

      取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

      比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

      称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。

      反码是相互的,所以也可称:

      11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。

      补码:反码加1称为补码。

      也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

      比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。

      那么,补码为:

      11111111 11111111 11111111 11111010 1 = 11111111 11111111 11111111 11111011

      所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

      再举一例,我们来看整数-1在计算机中如何表示。

      假设这也是一个int类型,那么:

      1、先取1的原码:00000000 00000000 00000000 00000001

      2、得反码: 11111111 11111111 11111111 11111110

      3、得补码: 11111111 11111111 11111111 11111111

      正数的原码,补码,反码都相同,都等于它本身

      负数的补码是:符号位为1,其余各位求反,末位加1

      反码是:符号位为1,其余各位求反,但末位不加1

      也就是说,反码末位加上1就是补码

      1100110011 原

      1011001100 反 除符号位,按位取反

      1011001101 补 除符号位,按位取反再加1

      正数的原反补是一样的

      在计算机中,数据是以补码的形式存储的:

      在n位的机器数中,最高位为符号位,该位为零表示为正,为1表示为负;

      其余n-1位为数值位,各位的值可为0或1。

     

      当真值为正时:原码、反码、补码数值位完全相同;

      当真值为负时: 原码的数值位保持原样,

      反码的数值位是原码数值位的各位取反,

      补码则是反码的最低位加一。

      注意符号位不变。

      如:若机器数是16位:

      十进制数 17 的原码、反码与补码均为: 0000000000010001

      十进制数-17 的原码、反码与补码分别为:1000000000010001、1111111111101110、1111111111101111

     

    展开全文
  • 计算机二进制储存

    千次阅读 2018-10-09 01:26:37
    首先我们在数学中学习过对一个十进制数字进行除二余法之后倒序排列获得这个十进制数的二进制数。以为例: 11除以2等于5,余数为1;5除以2等于2,余数为1;2除以2等于1,余数为0;1除以2等于0,余...
  • declare @a BINARY(2) ...BINARY(2) = 16 位二进制数 换算16进制位4位 2进制数 最大值为524287 转换16进制OxFFFF (111111111111111) 最高位值32768,转换16进制Ox8000 即两个字节位(10000000000000...
  • Java-二进制

    2019-02-15 20:52:46
    整数的二进制表示 正整数的二进制表示 每个位置都有一个位权,从右到左,第一位为1,然后一次乘以2,即第二位为2,第三位为4,以此类推 负整数的二进制表示 二进制使用最高位表示符号位,用1表示负数,用0表示正数。...
  • 动态二进制树搜索算法 二进制搜索树 (Binary Search Tree) A binary search tree is a useful data structure for fast addition and removal of data. 二进制搜索树是用于快速添加和删除数据的有用数据结构。 It...
  • 二进制编码知识

    2016-05-17 20:18:12
    对于整型数据,二进制的...即将余数反序排列对于小数部分,每次将其小数位乘以2,其整数位,直到小数位为0(然而存在死循环问题,即0.2*2,这大概就是精度问题了吧)二进制转十进制则将每一位按权展开后计算,即按权
  • JAVA二进制详解

    千次阅读 2017-07-18 20:00:01
    1、什么是二进制? 计算机内存中只有二进制,任何数据都需要转换为2进制才能计算处理2、十进制 逢十进一,99进位连续进两位,以此类推 数字: 0 1 2 3 4 5 6 7 8 9 权:10000 1000 100 10 1 基数:10 权...
  • &...所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;反码表示法规定:正数的反码
  • * 2)、一个二进制位用0和1表示,最大值是1 * 3)、一个八进制位表示3个二进制位,最大值是7 * 4)、一个十六进制位表示4个二进制位,最大值是15 * */ public class DecimalConvert { public stat
  • Java中的二进制

    千次阅读 2020-09-19 08:55:34
    为了说清楚二进制,先说一下我们生活中常用的十进制,十进制看起来很简单,那是因为我们从小接受的就是十进制的教育: 这是一个普通的十进制数,八十三万七千零五十六,这个数字可以表示如下: 再来看看二进制 这...
  • 二进制:  1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1。  2,在计算机当中其它进制的算法基本基于2进制,因为计算机只认识0和1,比如16进制数则意味着一位16进制码由4位2进制码数表示。  3,在Java...
  • 二进制和位运算

    千次阅读 2019-03-15 20:03:26
    所有编程语言都是一种人和计算机之间的翻译工具,人的数组语言翻译成二进制给计算机读取,然后把计算机的二进制数据翻译成人类的语言呈现出来。 16进制 16进制用于缩写(简写)2进制,将2进制从后向前 每4位数转换...
  • 取二进制(非符号位)的最高位1

    千次阅读 2019-03-09 20:47:17
    将最高位的1向后扩散到比它低的...// 如果数特别大, 这里感觉会溢出, 所以这里只使用于小于数据最大值1/2的数。 return ( x + 1 ) >> 1 ; //0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 }
  • 二进制运算

    千次阅读 2019-03-10 16:27:06
    1.十进制转化为二进制(编译器为32进制) #include&amp;amp;lt;iostream&amp;amp;gt; using namespace std; int main() { int m,number ,s[32]; cin&amp;amp;gt;&amp;amp;gt;number; for...
  • MySQL二进制日志

    2018-10-01 02:04:49
    二进制日志是MySQL重要的日志之一,用于记录修改数据或有可能引起数据改变的MySQL语句,像select、show这种不会修改数据的语句,二进制日志是不会记录的。 这篇文章是对 MySQL 二进制日志文件做一个阐述,对于主从...
  • 二进制运算技巧

    千次阅读 2015-10-21 14:08:40
    假设都在x86或x86_64架构CPU上进行运算,二进制基本运算包括,加减乘除、与、或、异或、同或、移位等 假设n 为 32 位整形数,正整数n除以8的余数 : n & 0x07 假设n 为 32 位整形数,正整数n除以16的余数 :...
  • 二进制负数

    千次阅读 2014-09-25 13:30:01
    以前学习二进制编码时,老师讲了一堆堆的什么原码啊反码啊补码啊xxxx转换啊,还有负数的表示方式啊 总是记不零清,终于从网上找到了一种比较好的讲解方式,保存再share一下,不过为了系统化讲解,又找来了一些编码的...
  • 负数的二进制和十进制之间的转换

    万次阅读 2016-03-07 22:05:14
    负数的二进制和十进制之间的转换: 1. 十进制负数转换为二进制的方法为: 1、将十进制转换为二进制数。 2、对该二进制数求反。 3、再将该二进制数加1. 总之就是将十进制数转换为二进制数求补码即为结果。比如...
  • 各种二进制转换

    2020-06-08 13:12:29
    二进制使用最高位表示符号位,用1表示负数,用0表示正数。 byte a = -1,如果只是将最高位变为1,二进制应该是10000001,但实际上,它应该是11111111。 byte a=-127,如果只是将最高位变为1,二进制应该是11111111,...
  • 十进制转成二进制 十进制转八进制 十进制转十六进制 十六进制转成十进制 十六进制转成二进制 十六进制转成八进制 八进制转成十进制 八进制转成二进制 八进制转成十六进制 二进制转十进制 二进制转八进制 二进制转...
  • 本篇文章利用JavaScript实现LeetCode第868题 二进制间距(Binary Gap)。 题目描述: 给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。  如果没有两个连续的 1,返回 0 。
  • 计算机进制转换详解以及Java的二进制的运算方法

    千次阅读 热门讨论 2020-06-01 22:42:59
    本文介绍了计算机进制的基本概念,随后给出了常见进制转换的方法,然后介绍了整数的二进制的计算规则,最后说明了一些二进制计算需要注意的地方(坑)。
  • 二进制基础及位运算

    2019-12-04 16:06:09
    二进制计算 每一位上的数基数的索引次幂相加之和 例如:0101=12º+12²=5 第一位1基数2的索引0次幂+第三位1*基数2的2次幂等于5 其他进制计算等同 十进制转2进制:除2求余法 除2求余倒序表示 简便算法:记住2的10次...
  • 二进制中补码计算简单详实的讲解

    万次阅读 多人点赞 2015-04-28 16:39:32
    首先说明一点这篇博文是基于网络资料 写作而来,尊重知识,广泛传播;...很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,150
精华内容 69,260
关键字:

二进制取最大值