其他杂项 程序开发 ·

程序开发不同进制记录以及转换

对于一个半路出家的程序猿,对各种不同的进制还是一直处在一个比较尴尬的局面,这次下定决心写写下这篇关于进制的文章,同时也进一步掌握进制。

常用的进制分为以下几种:

二进制即所谓的每逢2进1,八进制即每逢8进1,以此类推。

二进制

二进制是计算机最后能识别的指令,二进制只有0和1来表示整形数据(short,int,long等)。下面是1到9的二进制表示:

1 01
2 010
3 011
4 0100
5 0101
6 0110
7 0111
8 01000
9 01001

二进制简单,直接,粗暴。在计算机中最基本的存储单位就是bit即位。以java中的数据原型为例。在java中有byte,char,short,int,long等整型数据,那么他们对应的bit和所能表示数据大小如下:

byte    8bits   -2^7 ~ 2^7-1        -128 ~ 127
char    16bits   0 ~ 2^15-1          0 ~ 65535
short   16bits  -2^15 ~ 2^156-1      -32768 ~ 32767  
int     32bits  -2^31 ~ 2^31-1      -2147483648~2147483647 
long    64bits  -2^63 ~ 2^63-1       -9233372036854477808-9233372036854477807

对此上面的内容,可以让我们选择合适数据类型来表示数据,这样就正确的使用内存。

八进制

八进制采用的是0,1,2,3,4,5,6,7来表示,逢八进一。在代码我们一般在前面加个0来表示八进制。如下用八进制表示7,8,10,14,16,20。

7   07
8   010
10  012
14  016
16  020
20  024

十进制

十进制是生活中最常用的进制方法,才有0到9的10个数字来表示,逢10进1。在代码中我们直接用数组表示10进制数据,如:

1   1
20  20
36  36
100 100

因为我们从小用的最多就是十进制,所以十进制对于我们来说是最熟悉的。完全不用去思考如何表达。

十六进制

十六进制采用09数字和AF字母来表示。在代码中是以0x或0X开头来表示16进制的数据。

A B C D E F 0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9

根据以上来用16进制表达不同数值

8   0x8
10  0xA
15  0xf
16  0x10
25  0x19
31  0x1F

以上是不同的进制的表示。而且都是用不同的进制表示10进制的数值。下面我用代码把一个int类型的n转化成二进制,八进制和16进制。

n转二进制

private static String toBinary(int n){
        StringBuffer buffer = new StringBuffer();
        int temp = n;
        while(n > 1){
            n = n/2;
            if(n%2 != 0){
                buffer.append("1");
            }else{
                buffer.append("0");
            }
        }
        buffer.reverse();
        if(temp%2 == 0){
            buffer.append("0");
        }else{
            buffer.append("1");
        }
        return buffer.toString();
    }

这段算法还有改进的空间,而且还可以使用递归的方式来写!转化之法就是取余。用数子199例子:

199/2 = 99   余1
99/2 = 49    余1
49/2 = 24    余1
24/2 = 12    余0
12/2 = 6     余0
6/2 = 3      余0
3/2 = 1      余1
1/2 = 0      余1

所以199二进制是 11000111以上就是这种根据这种方法,下面看10进制转8进制和16进制的代码。

n转八进制

private static String toOCT(int n){
        StringBuffer buffer = new StringBuffer();
        while(n > 0){
            buffer.append(n%8);
            n = n/8;
        }
        return buffer.reverse().toString();
    }

n转十六进制

private static String toHex(int n){
		StringBuffer buffer = new StringBuffer();
		while(n > 0){
			if(n%16 > 9){
				switch(n%16){
				case 10:
					buffer.append("A");
					break;
				case 11:
					buffer.append("B");
					break;
				case 12:
					buffer.append("C");
					break;
				case 13:
					buffer.append("D");
					break;
				case 14:
					buffer.append("E");
					break;
				case 15:
					buffer.append("F");
					break;
				}
			}
			else{
				buffer.append(n%16);
			}
			n = n/16;
		}
		return buffer.reverse().toString();
	}

八进制转二进制

二进制的3自方就是8,所以每一个八进制的数字都可以用三位2进制的来表示。如015256表示一个八进制数,那么用二进制就是如下表示。

1->001  5->101  2->010  5->101  6->110  
015256 --> 000 001 101 010 101 110

16进制转二进制

和八进制转二进制的方法是一样的,2^4就是16,所以16进制每个数值可以用4位二进制的表示。如0x85feb:

8->1000  5->0101  f->1111  e->1110  b->1100
0x85feb --> 1000 0101 1111 1110 1100

上面都是转二进制,如果把二进制转其他就是相反的了!有了上面这些过程,我想把二进制转成其他的进制也不难!假如不能直接互转,也可以先转二进制再转其他的进制!下面附上进制转换表一张镇楼!

秋名山上行人希,常有高手论高低,如今道路依旧在,不见当年老司机!!

参与评论