进制: 在计算机中所有数据都是用二进制存储的,一个整数也是用二进制但是是用一串1,0组合的数据表示的。
进制的表现形式主要是4种:二进制(0,1)、八进制(0,1,2,3,4,5,6,7)、十进制(0,1,2,3,4,5,6,7,8,9)、十六进制。
二进制--->十进制
原理:二进制乘以2的过程,从右往左分别乘以2(顺序的次幂)
即:00001011 ->>11
过程:1*2(0)+1*2(1)+0*2(2)+1*2(3) =1+2+0+8=11
二进制--->八进制
原理:每一位8进制数最大值为7,在进行转换的时候二进制的每三位组成一个8进制数。
例如:00001011--->13过程:011 =1*2(0)+1*2(1) +0*2(2)=3
001= 1*2(0)+0*2(1)+0*2(2) = 1
即00001011--->13
二进制--->十六进制
原理:二进制中4个为一位16进制数.
十六进制中的元素为0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
例如:1011
1011 = 1*2(0)+1*2(1) +0*2(2)+1*2(3) = 11 ,11在十六进制中对应的数据是B
因此00001011--->B
十进制--->二进制
原理:对十进制数进行除二运算,取每次除2的余数直到
即:11-->1011
过程:11/2 =5 余数为1,
5/2=2 余数为1,
2/2=1 余数为0,
1不能再除2 就是1
所以11的二进制1011
代码演示:
public class HexDemo {
public static void main(String[] args) {
toBin(11);
}
public static void toBin(int num)
{
//定义一个存储每次num%2取余的数据容器
StringBuffer sbf = new StringBuffer();
while(num>0)
{
//把次num%2取余的数据添加进容器
sbf.append(num%2);
//用num/2的商进行下一次预算
num = num/2;
}
//打印结果,利用容器的反转功能将结果反转成二进制数
System.out.println(sbf.reverse());
}
}
十进制--->八进制原理:当计算机运行的时候十进制会先转成二进制数存储,然后利用二进制转换八进制的原理进行运算,每次&7,向右3位。
001-011&000-111 =7
----------------------------------------------------------------------
000-011 = 3
将001-011右移3位,在&7
000-001
&000-111 =7
----------------------------------------------------------------------
000-001 =1
结果就是13;
代码演示
public class OctDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
toOct(11);
}
public static void toOct(int num)
{
//定义一个数组用来存放八进制元素
char[] chs = {'0','1','2','3','4','5','6','7'};
//定义一个数组存储每次 num&15的数据容器
char[] arr = new char[8];
//定义一个操作数组的指针
int pos = arr.length;
while(num!=0)
{
int n = num&7;
//每次存得到数组中最后一位数据
arr[--pos] = chs[n];
//每次向右移3位
num = num >>> 3;
}
//打印存储数据数组
for (int i = pos; i < arr.length; i++) {
System.out.print(arr[i]);
}
//System.out.println(sbf.reverse());
}
}
十进制--->十六进制
原理:当计算机运行的时候十进制会先转成二进制数存储,然后利用二进制转换十六进制的原理进行运算,十六进制中的元素最大角标为15,
因此我们可以利用一个表来进行查看对应数据,每次&15以后再向由移4位
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
以十进制数11来进行分析
0000-0000 0000-0000 0000-0000 0000-1011 -------->11的二进制数
&0000-0000 0000-0000 0000-0000 0000-1111 =15
----------------------------------------------------------------------
0000-00000 0000-0000 0000-0000 0000-1011 = 11 去查找十六进制中角标为11的元素 B
右移4位&15 结果0000-0000 0000-0000 0000-0000 0000 =0
最后结果就是B
代码演示
public class HexDemo1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
toHex(60);
}
public static void toHex(int num)
{
//定义一个数组用来存放十六进制元素
char[] chs = {'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
//定义一个数组存储每次 num&15的数据容器
char[] arr = new char[8];
//定义一个操作数组的指针
int pos = arr.length;
while(num!=0)
{
int n = num&15;
//每次存得到数组中最后一位数据
arr[--pos] = chs[n];
num = num >>> 4;
}
//打印存储数据数组
for (int i = pos; i < arr.length; i++) {
System.out.print(arr[i]);
}
//System.out.println(sbf.reverse());
}
}