二进制算法 二进制转换十进制 - 澳门新葡萄京8455官网_澳门新浦京23488.com_澳门新葡萄京所有网站_【顶级平台】

澳门新葡萄京8455官网

  • “海归”的价值绝不只是“卖个好价” 2019-07-16
  • 入华15年后 亚马逊中国电商业务大撤退 2019-07-16
  • 1179只基金重仓中国平安 2019-07-16
  • 去这5个欧洲国家深度游,比国内旅行还便宜! 2019-07-16
  • GEN.G俱乐部获得威尔史密斯等人4600万美元投资 2019-07-16
  • 今天的少年儿童应该唱什么歌 2019-07-16
  • 普京专车首次敞篷展示 俄国防部长将乘该车参加红场阅兵 2019-07-16
  • 健康--吉林频道--人民网 2019-07-16
  • 33分11助攻 威少的雷霆反击 2019-07-16
  • 新版 Skype 增强的免费通话和聊天功能 2019-07-16
  • “微警局”持续提升公安战斗力 2019-07-16
  • 苏州兄妹失散57年 找到时发现两家相隔仅1公里 2019-07-16
  • [新浪彩票]足彩19053期盈亏指数:瓦朗谢纳主胜 2019-07-16
  • 记者专稿--江苏频道--人民网 2019-07-16
  • 一季度零售业景气回暖  逾10亿元大单布局5只概念股 2019-07-16
  • 澳门新葡萄京8455官网(澳门新葡萄京8455官网 www.briskyray.com)致力打造最全面的图片集资讯网站。

    二进制算法 二进制转换十进制

    来源:澳门新葡萄京8455官网|分类:星座易卦|时间:2019-03-27 04:01:44|作者:

    澳门新葡萄京8455官网 www.briskyray.com java里面是有进制间互换现成的方法的:

    public class 十进制与各进制的相互转换 {
    public static void main(String[] args){
    //java已经实现的机制:十进制转换为二进制
    int decimal = 10;
    System.out.println("十进制数:"+decimal+",转换为二进制:"+Integer.toBinaryString(decimal));
    System.out.println("十进制数:"+decimal+",转换为八进制:"+Integer.toOctalString(decimal));
    System.out.println("十进制数:"+decimal+",转换为十六进制:"+Integer.toHexString(decimal));
    System.out.println("二进制数:"+"1010" +",转换为十进制:"+Integer.valueOf("1010", 2));
    System.out.println("八进制数:"+"12" +",转换为十进制:"+Integer.valueOf("12", 8));
    System.out.println("十六进制数:"+"a" +",转换为十进制:"+Integer.valueOf("a", 16));
    }
    }

    结果:

    十进制数:10,转换为二进制:1010
    十进制数:10,转换为八进制:12
    十进制数:10,转换为十六进制:a
    二进制数:1010,转换为十进制:10
    八进制数:12,转换为十进制:10
    十六进制数:a,转换为十进制:10

    但如果不取Integer的内含方法,我们要怎么实现进制之间的转换呢?

    下面针对二进制-->十进制实现其算法过程:

    一般思维:

    当问到二进制数转为十进制数,大多数人脑里第一反应的应该是这样一个逻辑过程:

    二进制数:1010

    十进制数:1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 =  8 + 0 + 2 +0 = 10

    按这个思路,java代码可以这样实现:

    方法一:
    public int binaryToDecimal(String inMsg){
    int x = 0;
    int mul = 1;
    for(int i = inMsg.length()-1;i>0;i--){
    x += mul*(inMsg.charAt(i)=='1'?1:0);
    mul*=2;
    }
    System.out.println(mul);
    return mul;
    }

    好奇在网上也找了下其他实现方法:

    方法二:
    String radix = "1010";
    public int method(String radix){
    int x = 0;
    for(char c:radix.toCharArray())
    x = x*2 + (c=='1'?1:0);
    System.out.println(x);
    return x;
    }

    对比以上两个方法,方法一和我们平常的思维是一致的,但是方法二就不大好理解了,略作思考后,发现可以这样理解:

    1、从for(char c:radix.toCharArray())这行代码可以看出,需要将待求解的二进制数转换为char数组;显然,当待求解二进制数为1010时,char数组即为:char[1,0,1,0],数组中有4个元素,那么也就是说for循环要循环运行4次。

    2、显而易见,for循环里面的算式组成部分的(c=='1'?1:0)目的就是为了拿到当前循环时对应二进制数组下标的值。

      如:第一次循环,拿到二进制数组下标为0的值:1

        第二次循环,拿到二进制数组下标为1的值:0

        第三次循环,拿到二进制数组下标为2的值:1

        第四次循环,拿到二进制数组下标为3的值:0

    3、算法:x = x*2 + (c=='1'?1:0) 的原理解析:前半部分x*2,是为了实现二进制数组元素的幂次相乘(之前的int x = 0其实实现了char[]数组的size()-1的作用),后半部分获取了下次进行幂运算的char数组的元素值。

    解析:

    第一次循环:看方法二的第三行代码:int x = 0;x初始值为0,就导致了for循环第一次循环时,运算为:0*2+1  ,即只会得到算式(c=='1'?1:0)的值,即二进制数组第一个元素的值:1 ;这时循环已经进行了1次,还剩3次,所以这里的1会在后面的3次循环里分别乘以2 , 即1*2*2*2;

    第二次循环:算式为: (0*2 + 1)*2 + 0  == 0*2*2 + 1*2 + 0  ,第一部分0*2*2不用管,因为这个是int x=0起作用用的, 第二部分是第一次循环时得到1的第一次幂运算1*2, 第三部分就是二进制数组下标为1的元素:0,也是下一次循环会进行幂运算的数。   这时我们发现总共的4次循环已经进行了2次,剩下2次,所以这里的下次幂运算值:0会在后面的2次循环里分别乘以2,即0*2*2;

    第三次循环:算式为: ((0*2 + 1)*2 + 0)*2 +1  == 0*2*2*2 + 1*2*2 + 0*2 +1  ,第一部分0*2*2*2不用管,第二部分是第一次循环时得到1的第二次幂运算1*2*2, 第三部分是第二次循环时得到0的第一次幂运算0*2,第四部分就是二进制数组下标为2的元素:1,也是下一次循环会进行幂运算的数。   这时我们发现总共的4次循环已经进行了3次,剩下1次,所以这里的下次幂运算值:1会在后面的1次循环里乘以2,即1*2;

    第四次循环:算式为: (((0*2 + 1)*2 + 0)*2 +1 )*2 +1 == 0*2*2*2*2 + 1*2*2*2 + 0*2*2 +1*2 + 0  ,第一部分0*2*2*2*2不用管,第二部分是第一次循环时得到1的第三次幂运算1*2*2*2, 第三部分是第二次循环时得到0的第二次幂运算0*2*2,第四部分是第三次循环时得到1的第一次幂运算1*2,第五部分就是二进制数组下标为3的元素:0,也是下一次循环会进行幂运算的数。   这时我们发现总共的4次循环已经进行了4次,剩下0次,

    所以本次运算就是整个算法的结果: 0*2*2*2*2   +   1*2*2*2   +   0*2*2   +   1*2   +   0  =  0 + 8 + 0 + 2 + 0  =  10 ,这样看是不是觉得很熟悉!没错,其实原理还是和方法一一样样的。