您的位置:首页 > 职场人生

黑马程序员-----------------进制间的转换

2014-03-28 17:32 239 查看
android培训java培训、期待与您交流!

进制: 在计算机中所有数据都是用二进制存储的,一个整数也是用二进制但是是用一串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
;
//每次向右移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
;
num = num >>> 4;

}
//打印存储数据数组
for (int i = pos; i < arr.length; i++) {
System.out.print(arr[i]);
}

//System.out.println(sbf.reverse());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: