java回忆录—神奇的进制世界

进制就是进位制,是人们规定的一种进位方法。 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位。

二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。

我们知道不同进制的数表示形式肯定不一样,不然怎么区分开来呢,对,不同进制的数据组成。

二进制——由0,1组成,以0b开头。(b大小写都行)

八进制——由0,1,…,7组成,以0开头。

十进制——由0,1,…,9组成,整数默认为十进制。

十六进制——由0,1,…,9,a,b,c,d,e,f组成(大小写均可),以0x开头。

那先来看下各个进制之间如何转换的吧?我们需要掌握的进制转换:

1)十进制转换成任意进制

2)任意进制转换成十进制

3)任意进制转换成任意进制

首先大家把X进制的X叫做基。
先来看看第一种进制转换(十进制转换成任意进制)
接下来介绍的这种方法叫做除基取余法

什么叫除基取余法呢?

举个例子:十进制10转换成二进制为1010

这里写图片描述

从这张图可以看出为什么这样叫了吧,其实十进制转换成任意进制都可以用这种方法,只不过除数变了而已。如二进制转换成八进制基就为8,十进制转换成十六进制基就为16,等等。。。

当然还有一种更简单的方法,叫做拆分填充法

这里写图片描述

咋一看有点像填图的感觉,当然这种方式用于比较小的数,因为比较容易拆分嘛。

这个就介绍完了,是不是很简单呢,那么再来看看第二种转换(任意进制转换成十进制)

这种转换的话应该很简单了,只需要掌握个技巧。

这里写图片描述

记住上面这张图,即记住每种进制的每一位表示多少,其实很好记的,就是基的次方递增。如二进制为2^0,2^1,……,然后对应位相乘再累加即可。

例子:十六进制0x16e转换成十进制为 1*16^2+6*16^1+14*16^0 = 366

其他进制转换成十进制的方法同理。

还有最后一种进制转换(任意进制转换成任意进制)

其实这个也是不难的,有一种思路就是将十进制作为一个中间进制。

比如二进制要转换成八进制,可以先将二进制转换成十进制,再将十进制转换成八进制,这两种进制的转换上面都讲过,这里就不重复讲了。

这是一种方式,其实还有一种小技巧,我们可以发现八进制或十六进制的基是二进制的基的倍数即 8=2^3,16=2^4

所以我们可以利用这一点,当二进制和八进制之间相互转换的时候,我们可以将八进制的一位当做二进制的三位。

怎么理解呢?举个例子:

二进制100100转换成八进制为44

怎么来的呢?

这里写图片描述

同理二进制转换成十六进制的原理:二进制的四位表示十六进制的一位

如:二进制11001000转换成十六进制为c8

这里写图片描述

是不是觉得这种方式更简单呢,赶快试试吧。

我们都知道,如果不用它写什么特别的东西的话,java能用到的多点的也就是二进制,因为有些文件的流(例如图片,视屏,音乐)都是二进制的………

在计算机内,有符号数有三种表示方式:原码、反码、补码。所有数据的运算都是采用补码进行的。

原码

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

反码

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

补码

 正数的补码与其原码相同;负数的补码是在其反码的末位加1。

现在来看看正数和负数在计算机中是如何存储的,当然肯定都是补码了。

+7、-7

+7的原码、反码、补码都相同:0000 0111
-7的原码:1000 0111 反码:1111 1000 补码:1111 1001

那么如何已知补码求原码呢?其实很简单,就是取反加1

如:已知某数X的补码1110 1110B,试求其原码。

取反加1:1001 0001 + 1 = 1001 0010

记住:

已知负数的原码——>求补码:取反加1(符号位不变)

已知负数的补码——>求原码:取反加1(符号位不变)

上面讲了那么多,那么在java中如何使用呢?其实转换的都有相应的函数帮你转换,那么还懂它如何转换干嘛,我们学这个,不能停留在“只知其然,不知其所以然。”我们应该知道它计算机是如何转换的,这样用起来才能游刃有余。

那么就来看看java中如何使用吧。

首先在java中使用的是Integer中的静态方法:

十进制转换成十六进制:Integer.toHexString(int i)

十进制转换成八进制: Integer.toOctalString(int i)

十进制转换成二进制: Integer.toBinaryString(int i)

其他进制转换成二进制:Integer.parseInt(String s,int radix)

    其中,

    参数 String s ,必需,表示要被解析的字符串。

    int radix ,可选,表示要解析的数字的基数。 

    该函数使用第二个参数指定的基数,其值介于 2 ~ 36 之间。

    如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

    如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

例子:

public class JiZhi {

    public static void main(String args[]) {
        int i = 10;
        System.out.println("十进制数 " + i + " 转换成十六进制为 " + Integer.toHexString(i));
        System.out
                .println("十进制数 " + i + " 转换成八进制为 " + Integer.toOctalString(i));
        System.out.println("十进制数 " + i + " 转换成二进制为 "
                + Integer.toBinaryString(i));
        String str = "A";
        System.out.println("十六进制数 " + str + " 转换成10进制为 "
                + Integer.parseInt(str, 16));
        str = "012";
        System.out.println("八进制数 " + str + " 转换成10进制为 "
                + Integer.parseInt(str, 8));
        str = "1010";
        System.out.println("二进制数 " + str + " 转换成10进制为 "
                + Integer.parseInt(str, 2));
    }

}

结果:

这里写图片描述

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值