进制就是进位制,是人们规定的一种进位方法。 对于任何一种进制—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));
}
}
结果: