精华内容
下载资源
问答
  • 整数和小数分别转换。 整数除以2,商继续除以2,得到0为止,将余数逆序排列。 22 / 2 11 余0 11/2 5 余 1 5 /2 2 余 1 2 /2 1 余 0 1 /2 0 余 1 所以22的二进制是10110 小数乘以2,取整,小数部...

    整数和小数分别转换。
    整数除以2,商继续除以2,得到0为止,将余数逆序排列。
    22 / 2  11 余0
    11/2     5  余 1
    5 /2      2  余 1
    2 /2      1  余 0
    1 /2      0  余 1
    所以22的二进制是10110
    小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
    0.8125x2=1.625 取整1,小数部分是0.625
    0.625x2=1.25 取整1,小数部分是0.25
    0.25x2=0.5 取整0,小数部分是0.5
    0.5x2=1.0 取整1,小数部分是0,结束
    所以0.8125的二进制是0.1101
    十进制22.8125等于二进制10110.11011

    005804_Cvw3_2611009.png

     

     

    转载于:https://my.oschina.net/u/2611009/blog/814110

    展开全文
  • 打印出二进制(第一个数为个位,第二个数为10位,即乘以10,第三位数为百位, 即乘以100。。以此类推,即循环乘以10),直到除数 为0为止。小数乘以2,取整然后打印2进制,直到小数部分为0为止,或者打印小数 后7...

    /*算法:把小数分成两截,一截是整数,一截是小数。让整数除以2取余,倒叙输出来
    打印出二进制(第一个数为个位,第二个数为10位,即乘以10,第三位数为百位,
    即乘以100。。以此类推,即循环乘以10),直到除数
    为0为止。小数乘以2,取整然后打印2进制,直到小数部分为0为止,或者打印小数
    后7位为止。(实就是每次循环让第一个数x0.1,第二个数x0.01,依次如此。
    最后相加,打印累加的值)*/
    import java.util.*;
    public class TenToTwo
    {
    public static void main(String[] args){
    int sumInt=0,h=0;
    double sumDouble=0,j=0.1;
    System.out.print("请输入一个数:");
    Scanner sc=new Scanner(System.in);
    double num=sc.nextDouble();
    int numInt=(int)num;//取整数部分
    double numD=num-numInt;//取小数部分
    //整数部分求二进制
    for(int i=1;;i=i*10){
    /*int chuShu=numInt/2;
    int yuShu=numInt%2;//余数部分为2进制的一位
    sumInt+=yuShu*i;
    numInt=chuShu;//把除数赋予整数,循环让下一次去除*/
    //上面的代码可以简化成下面的两行
    sumInt+=numInt%2*i;
    numInt=numInt/2;
    if(numInt==0){
    break;
    }
    }
    //小数部分求二进制
    for(;;j=j*0.1){
    /*int zhengShu=(int)(numD*2);//求二进制数
    sumDouble+=zhengShu*j;//一个二进制数*0.1,下一个则乘以0.01,依次,最后累加
    double xiaoShu=numD*2-zhengShu;//剩下的小数
    numD=xiaoShu;//剩下的小数赋予numD去循环,因为剩下的小数也要继续乘以2*/
    //上面的代码可以简化如下两行:
    sumDouble+=(int)(numD*2)*j;
    numD=numD*2-(int)(numD*2);
    h++;//计已经有了小数点后多少位数
    if(numD==0||h==7){
    break;
    }
    }
    System.out.print(num+"的二进制数为:"+(sumInt+sumDouble));
    }
    }
    展开全文
  • 遗传算法应用 一、问题概述 求 y=10sin(5x)+7*|x-5|+10 最大值。 二、问题解决 1.产生初始种群 用随机数生成器分别产生8、16、32个随机数(由于...matlab中十进制转二进制函数dec2bin()默认是6位,因此,我们先采用...

    遗传算法应用

    [1]、[2]、[3]在文章的最后用图像进行说明。

    一、问题概述

        求 y=10sin(5x)+7*|x-5|+10 最大值。函数图像如图:
           

    二、问题解决
    1.产生初始种群

      用随机数生成器分别产生8、16、32[1]随机数作为初始种群。
      由于给出的函数定义域是全体实数,且rand()函数只能生成[0,1]的随机数,我们取一个范围(如 [0,10])作为倍率,以产生大于1的数

      代码如下:

    %% 设置变量
    N=32;%初始群体大小,即产生N个在(a,b)范围内的随机数
    a=0;%自变量取值下界
    b=10;%自变量取值上界
    
    %% 1.产生初始群体
    initalGroup10=a+(b-a).*rand([N 1]);%初始群体,十进制编码
    2.编码与解码

      采用二进制编码,matlab默认编码位数。matlab中十进制转二进制函数dec2bin()默认会取最合适的编码位数。如果指定了编码位数,则多余部分会补零。
    需要注意的是,matlab中的dec2bin()只能转换整数部分,小数部分会被自动省去。下面链接介绍了一种能将十进制小数转换为二进制的方法。这里我们先用dec2bin()。
    matlab实现十进制小数转换为二进制

    3.确定适应度

       将初始种群带入目标函数,目标函数的值定为适应度。

        %% 2.求初始群体的适应度
        %适应度函数,即为目标函数
        adaptLevel = objectFun(initalGroup10);
        %将初始种群和适应度组合
        initalGroup = [initalGroup10 adaptLevel];

      其中,objectFun() 代码如下:

    function y = objectFun(x)
        y = 10.*sin(5.*x)+7.*abs(x-5)+10;
    end
    4.复制

      采用轮盘赌的方法确定复制个体。

        %% 3.确定复制个体
        %确定需要复制的个体的序号
        copyIndex=trochalDisk(initalGroup,N);
        %copyIndex返回的序号是对initalGroup排序后的序号,因此对适应度值升序排序
        sortrows(initalGroup,-2);
        %复制后的种群
        copyGroup10=[];
        for i=1:size(copyIndex)
            copyGroup10=[copyGroup10 initalGroup(copyIndex(i),1)];
        end

      其中,trochalDisk()是轮盘赌实现函数,代码如下:

    function index =trochalDisk(pk,N)
    %pk 轮盘每一份的值 
    %N  轮盘的份数
        %排序
        sortrows(pk,-2);
        pk=pk(:,2);
        %确定轮盘法则的区间trochal
        trochal=cumsum(pk(:));
        
        %随机产生N个数,并确定在轮盘的哪个区间
        tc=trochal(1)+(trochal(end)-trochal(1)).*rand([N 1]);
        index=[];
        for i=1:size(tc)
            t=find(trochal>=tc(i));
            index=[index;t(1)];
        end
    end
    5.交叉和变异

      需要依次确定交叉和变异中的几个随机。
    1)交叉中有三个随机:个体随机、概率可调、编码位置随机。

    • 随机数生成器确定发生交叉的个体序号。
    • 交叉概率为50%~80%[2],可以上下浮动。采用人为输入
    • 随机数生成器确定发生交叉的编码位置(产生一个或多个,这里以多个为例)。

    2)变异中有三个随机:个体随机、哪位变异随机、变异几位随机。

    • 随机数生成器确定发生变异的个体序号。
    • 变异概率为0.1%~1%[3],可以上下浮动。采用人为输入
    • 随机数生成器确定发生变异的编码位置(产生一个或多个,用随机数决定)。

      代码如下:

    crossProbility=0.07;%交叉概率50%~80%,可以上下浮动
    variationProbility=0.001;%变异概率0.1%~1%,可以上下浮动
    crossGroup = cross(crossProbility,copyGroup10);
    variationGroup = variation(variationProbility,crossGroup);

      其中,cross()是交叉实现函数,variation()是变异实现函数。

    function crossGroup = cross(probility,group)
    %crossGroup 交叉后的种群
    %probility 交叉概率
    %group 复制后的种群
    
    %确定几个个体发生交叉,让每两个相邻个体发生交叉,因此定为偶数个
    crossNumber=floor(probility*size(group,2));
    if rem(crossNumber,2)~=0
        crossNumber = crossNumber+1;
    end
    %随机产生个体交叉的序号
    crossIndex=floor(1+(size(group,2)-1).*rand([crossNumber 1]));
    %随机产生个体交叉的位置,范围:1-二进制长度
    group2=dec2bin(group);
    crossPos=floor(1+(size(group2,2)-1).*rand([crossNumber/2 1]));
    
    %交叉
    for i=1:2:crossNumber
    %下面这段代码和C语言中最基本的swamp()函数效果一样
        temp=group2(crossIndex(i),crossPos:end);
        group2(crossIndex(i),crossPos:end)=group2(crossIndex(i+1),crossPos:end);
        group2(crossIndex(i+1),crossPos:end)=temp;
    end
    %2进制变为10进制
    crossGroup=bin2dec(group2);
    end
    function variationGroup = variation(probility,group)
    %variationGroup 变异后的种群
    %probility 变异概率
    %group 变异后的种群
    
    %确定几个个体发生变异
    variationNumber=floor(probility*size(group,2));
    %随机产生个体变异的序号
    variationIndex=floor(1+(size(group,2)-1).*rand([variationNumber 1]));
    group2=dec2bin(group);
    %确定发生变异的位置的个数
    variationPosNum=floor(1+(size(group2,2)-1));
    %随机产生个体变异的位置,1-二进制长度
    variationPos=floor(1+(size(group2,2)-1).*rand([variationPosNum 1]));
    
    %变异
    for i=1:variationNumber
        for j=1:variationPosNum
            if group2(variationIndex(i),variationPos(j))==0
                group2(variationIndex(i),variationPos(j))='1';
            else
                group2(variationIndex(i),variationPos(j))='0';
            end
        end
    end
    
    variationGroup=bin2dec(group2);
    end
    6.适应度验算

      以本次迭代和上一次迭代适应度值改变量是否小于给定精度,决定是否终止循环。

    下面给出主函数

    clear,clc
    %% 设置变量
    N=32;%初始群体大小,即产生N个在(a,b)范围内的随机数
    a=0;%自变量取值下界
    b=10;%自变量取值上界
    esp=0.0001;%精度
    
    crossProbility=0.7;%交叉概率50%~80%,可以上下浮动
    variationProbility=0.005;%变异概率0.1%~1%,可以上下浮动
    
    maxX=[];
    maxAdapt=[];
    count=0;%记录迭代次数
    
    %% 1.编码,产生初始群体
    initalGroup10=a+(b-a).*rand([N 1]);%初始群体,十进制编码
    while true
        count=count+1;
        %% 2.求初始群体的适应度
        %适应度函数,即为目标函数
        adaptLevel=objectFun(initalGroup10);
        initalGroup=[initalGroup10 adaptLevel];
        
        %% 5.适应度验算
        %对initalGroup适应度值升序排序
        sortrows(initalGroup,-2);
        
        %画图用
        index=find(initalGroup(:,2)==max(initalGroup(:,2)));
        maxX=[maxX initalGroup(index(1),1)];
        %最大适应度,如果求的是目标函数的最小值,就保留最小值
        maxAdapt=[maxAdapt initalGroup(index(1),2)];
    
        if size(maxX,2)~=1
            if abs(maxX(end)-maxX(end-1))<esp
                break;
            end
        end
        
        %% 3.确定复制个体
        copyIndex=trochalDisk(initalGroup,N);
        copyGroup10=[];
        for i=1:size(copyIndex)
            copyGroup10=[copyGroup10 initalGroup(copyIndex(i),1)];
        end
        
        %% 4.交叉与变异
        %交叉中的随机:个体随机、交叉位置随机、概率可调
        %变异中的随机:个体随机、哪位变异随机、变异几位随机
        crossGroup = cross(crossProbility,copyGroup10,a,b,esp);
        variationGroup = variation(variationProbility,crossGroup',a,b,esp);
        
        %% 为下次循环准备
        %交叉和变异过程中难免会出大于给定范围的值
        %将所有超出范围的值设成最大值
        %因为下面还会给每个数加上小数部分,所以最大值取范围上界-1
        variationGroup(find(variationGroup>=(b-1)))=b-1;
        %前面说到dec2bin只会编码整数部分,所以我们在这里加一个小数部分。
        %可以尝试一下去掉会是什么样子
        initalGroup10=variationGroup+rand([N 1]);
    end

    下面是一些实验结果图和分析过程

      各个图参数如下:

    N=32;%初始群体大小,即产生N个在(a,b)范围内的随机数
    a=0;%自变量取值下界
    b=10;%自变量取值上界
    esp=0.0001;%精度
    crossProbility=0.7;%交叉概率50%~80%,可以上下浮动
    variationProbility=0.005;%变异概率0.1%~1%,可以上下浮动
       [1]:在图1所用参数的基础上,选择不同种群大小,发现种群越大,迭代次数越少,越容易能达到全局最优
       [2]:在图1所用参数的基础上,选择不同交叉概率。做了30多次实验。。。才疏学浅,实在发现不了任何关系。。。
       [3]:在图1所用参数的基础上,选择不同变异概率。同样,也没发现任何关系。。。

       [4]:在图1所用参数的基础上,采用十进制小数转换为二进制的编码方式。一定要提高变异概率

       采用含小数的二进制后,二进制编码位数会加长,需要提高变异概率。
       如 9.9283,dec2bin() 编码只考虑整数部分,编码结果是 ‘1001’ ,每次变异产生差为1的概率是1/16 = 6.25%;而考虑到小数后编码结果为 ‘10011110110110100’(整数部分占4位,小数部分占13位),每次变异产生差为1的概率是24/217 = 0.012%。
       综上,采用含小数的二进制后,变异概率为编码方式为dec2bin()的变异概率的100倍左右,才会产生比较好的结果。

    左图是变异概率为0.1%时的结果,右图是变异概率为10%时的结果。

    到这里这道题就结束啦!
    如果哪里有错误还请大家批评指正呀~~~
    或者有哪位发现了交叉概率和变异概率取值的意义,烦请评论区留言呀,不胜感激!

    展开全文
  • 二进制字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印...十进制小数转化为二进制 class Solution { public String printBin(double num) { StringBuffer sb = new StringBuffer(); sb.ap.

    二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字不在0和1之间,或者无法精确地用32位以内的二进制表示,则打印“ERROR”。
    链接: leetcode.

    二进制小数转化为十进制

    在这里插入图片描述

    十进制小数转化为二进制

    在这里插入图片描述

    class Solution {
        public String printBin(double num) {
            StringBuffer sb = new StringBuffer();
            sb.append("0.");
            while(num != 0) {
            	num *= 2;
            	if(num >= 1) {
            		sb.append(1);
            		num -= 1;
            	}else {
            		sb.append(0);
            	}
            	if(sb.length() > 32)
            		return "ERROR";
            }
            return sb.toString();
        }
    }
    
    
    展开全文
  • 十进制小数转二进制序列

    千次阅读 2008-11-19 13:42:00
    这是一个我实验中首先要解决的问题,而且伴随着大量的重复...转换的过程,大致可以分两种方式:1,考虑到小数都是有精度限制的,比如精确到十进制小数点后5位;那么我可以将它转化为整数,然后再转化为bitset。采用整数
  • 十进制转二进制  假设我们要把十进制97转化成二进制!第一步把97除于2 得到48.8,无法整除,然后后面记录1! 无法整除的去到小数位,依次除于2,能整除的记录0,不能整除的记录1 最终的二进制结果为1100001 ...
  • 二、十进制数转换为二进制数 十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。 1. 十进制整数转换为二进制整数 十进制整数转换为二进制...
  • Java编程之十进制转二进制算法

    千次阅读 2017-07-18 20:32:58
    Java编写程序计算十进制整数及小数转二进制
  • 其中,将十进制整数转换为二进制整数采用的方法是“除二取余”,将十进制小数部分主要的方法是“乘二取整”。 1.除二取余法——将十进制整数转换为二进制整数 所谓除二取余法,就是把十进制整数除以2,得到一个商和...
  • 参考《计算思维与算法入门》 一、十进制转二进制:整数部分 二、十进制转二进制小数部分
  • 十进制转二进制

    2017-07-17 21:52:14
    (查询十进制小数转换成进制小数的算法,使用循环来实现。最多保留小数位后7位数字即可)*/ import java.util.*; public class TenToTwo {  public static void main(String[] args){  System.out.print("请输入...
  • 十进制数转换为二进制数 C++前言一、十进制转换为二进制的数学算法二、代码实现1.设计转换函数transfer2.完整代码总结 前言 这篇文章和大家分享一下我个人对十进制数转换为二进制数的想法,目前暂时更新只整数...
  • 计算机内部对数据的存储是利用二进制的方式实现的,为了更深入的了解二进制并能够熟练的进行十进制二进制的转换的计算,尝试使用java语言实现该算法。   备注:以前写的,现在放上来。 计算思路: 整数部分...
  • 十进制转换为其它进制时比较复杂,整数部分和小数部分的算法不一样,下面我们分别讲解。 整数部分 十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法。具体做法是: 将 N 作为除数,用十进制整数除以 N...
  • 在这里进行进制转换主要是思想的问题,大家都知道整数的十进制转二进制是比较容易实现的,而小数部分才是难点,所以我们在这里可以拆分为两个部分,整数部分和小数部分,以下就是详细代码加解释。 import java....
  • 如果把十进制的0.1转换成二进制,就会变成无限的小数。常规的做法是采用十进制高精度算法。但是十进制高精度算法的效率低,浪费内存。而且学过汇编和C语言的人一般会对这种方法感到很难以接受。那么我今天介绍的方法...
  • 之前对二进制十进制转换的算法一直比较模糊,后来看...下面我从正整数、负数、小数这三个部分记录二进制转十进制,然后反转。 1.正整数 24 https://jingyan.baidu.com/article/597a0643614568312b5243c0.html ...
  • double型10进制转二进制

    千次阅读 2017-07-17 11:55:14
    整数部分:除取余 ...(查询十进制小数转换成进制小数的算法,使用循环来实现。最多保留小数位后7位数字即可) /* Scanner sc=new Scanner(System.in); System.out.println("输入一个十进制小数");
  • 浮点数二进制十进制之间的转换 ... 把一个带小数二进制数n转换成十进制 小数点后面保留pre位小数 ''' # number1 表示二进制数,number2表示十进制数 string_number1=str(n) decimal = 0 # 小数部分

空空如也

空空如也

1 2 3 4 5 6
收藏数 109
精华内容 43
关键字:

十进制小数转二进制算法