java回忆录—神奇的进制世界 偏执的太偏执、 2022-09-24 14:24 108阅读 0赞 **进制**就是进位制,是人们规定的一种进位方法。 对于任何一种进制—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 ![这里写图片描述][20160802152034906] 从这张图可以看出为什么这样叫了吧,其实十进制转换成任意进制都可以用这种方法,只不过除数变了而已。如二进制转换成八进制基就为8,十进制转换成十六进制基就为16,等等。。。 当然还有一种更简单的方法,叫做**拆分填充法** ![这里写图片描述][20160802152134173] 咋一看有点像填图的感觉,当然这种方式用于比较小的数,因为比较容易拆分嘛。 这个就介绍完了,是不是很简单呢,那么再来看看第二种转换(任意进制转换成十进制) 这种转换的话应该很简单了,只需要掌握个技巧。 ![这里写图片描述][20160802154016998] 记住上面这张图,即记住每种进制的每一位表示多少,其实很好记的,就是基的次方递增。如二进制为2^0,2^1,……,然后对应位相乘再累加即可。 例子:十六进制0x16e转换成十进制为 **1\*16^2+6\*16^1+14\*16^0 = 366**。 其他进制转换成十进制的方法同理。 还有最后一种进制转换(任意进制转换成任意进制) 其实这个也是不难的,**有一种思路**就是将十进制作为一个中间进制。 比如二进制要转换成八进制,可以先将二进制转换成十进制,再将十进制转换成八进制,这两种进制的转换上面都讲过,这里就不重复讲了。 这是一种方式,其实**还有一种小技巧**,我们可以发现八进制或十六进制的基是二进制的基的倍数即 8=2^3,16=2^4 所以我们可以利用这一点,当二进制和八进制之间相互转换的时候,我们可以将八进制的一位当做二进制的三位。 怎么理解呢?举个例子: 二进制100100转换成八进制为44 怎么来的呢? ![这里写图片描述][20160802160754506] 同理二进制转换成十六进制的原理:二进制的四位表示十六进制的一位 如:二进制11001000转换成十六进制为c8 ![这里写图片描述][20160802161418249] 是不是觉得这种方式更简单呢,赶快试试吧。 我们都知道,如果不用它写什么特别的东西的话,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)); } } 结果: ![这里写图片描述][20160802165606768] [20160802152034906]: /images/20220719/c374415be9e14f21bffeb3c4000c481d.png [20160802152134173]: /images/20220719/f8da5ae369634572bf5250142ee7b9e5.png [20160802154016998]: /images/20220719/2ec8715affc84c60a6ceec1e320b221b.png [20160802160754506]: /images/20220719/2f98ab6ebd344267ae7f4099f545a1bc.png [20160802161418249]: /images/20220719/adca7459d8a04e57b09ca1520319a7fa.png [20160802165606768]: /images/20220719/9ad00afdcd6a4191bcf41c92de124649.png
还没有评论,来说两句吧...