欢迎访问博客:http://blog.csdn.net/newjueqi
文章出处:http://blog.csdn.net/newjueqi/archive/2009/04/05/4049468.aspx【文章标题】一种进制转换的特殊方法
【文章作者】曾健生
【作者邮箱】[email protected]
【作者QQ】190678908
【作者博客】http://blog.csdn.net/newjueqi
【编程环境】JDK 1.6.0_01
【作者声明】欢迎转载文章,但转载请保留文章的完整性以及注明文章的出处。******************************************************************************* 在平时的编程中,经常有各种进制的转换问题,本文针对实际编程中的M转N(N=2,4,8,16……,N必须为2的整数倍)进制提出了一种特殊的方法。 首先简单介绍一个基本的知识点: 大家知道,计算机是基于二进制的,所有数据都是以0和1的方式存放的,我们在屏幕上看到的丰富多彩的数据(包括各种声音,图像等)在计算机的硬盘上都是一大串0和1,同样的道理,我们在屏幕上看到的以各种进制表示的数据在硬盘和内存中都是以二进制的形式存放的。换句话来说,无论我们怎样转换进制,但最后存储在电脑上的都是二进制数,编程实现的进制转换只是改变数据的显示形式,但对在硬盘或内存中的存储的实际数据没有丝毫改变,因为数据在硬盘中永远只有0和1。
虽然以上的一段话讲的都是一些很闲浅的知识点,只要有一点计算机基础的同学都知道,但只有深刻理解上面一段话,才能弄明白本文所阐述的算法思想。
下面开始阐述这个进制转换的算法思想:
因为所有数据在计算机中都是以二进制的形式存放的,所以用编程实现的进制转换本质是把二进制数据用不同的进制形式显示出来,切记,进制转换只是改变数据的显示形式,在计算机中存放的依然是原来的二进制数据。
算法的实现过程就是用移位和去低位的方法:1. 用与(&)运算把需要用到的低位置换出来,完成置换数据的进制显示形式
2. 右移A位(如果N 为8,则A=3;如果N位16,则A=4)
3. 重复1和2,直到数据变为0为止现在举一段8进制转16进制的java代码例子说明这个算法思想,把八进制数据04526转化为16进制数据后显示出来 
 class Demo
{
public static void main( String args[] )
{
int num=04526; //需要转换的八进制数据,八进制数据在java中的表示必须要以0开头
int temp;

StringBuffer sb=new StringBuffer();

while( num>0 ) //①
{
temp=num&15; //②
if( temp >9 )
{
sb.append( (char)(temp-10+'A')); //处理获得的数大于9的问题,把数据转换为//字符’A’—‘F’的表示
}
else
{
sb.append( temp );
}

num=num>>4; //③
}

sb.reverse();
System.out.println( sb );

}
}
程序的输出结果为956下面针对这个程序的几处关键点分别说明一下:    八进制数据04526的二进制表示为100101010110,实际存储在计算机中的数据也是100101010110,我们把八进制04526转换成16进制,也就是把04526的二进制数据100101010110用16进制的形式显示出来(各位读者原谅本人的啰嗦,再重申一遍,进制转换改变的只是数据的显示形式,在计算机中存储的依然是100101010110), 而二进制转16进制的方法是以四位为一组,把每组的二进制数用16进制符号表示。
    现在的问题就是怎么用程序实现二进制的数据分组?         
    在逻辑与(&)运算中,任何数和1进行与(&)运算都是它的本身,任何数和0进行与(&)运算都变为0,现在要把低四位取出来出来变为一组,换个角度思考就是低4位不变,其他位变成0,就是要把100101010110和 000000001111进行与运算(十进制表示为15,这就是语句②temp=num&15的解释)
当  temp=num&15  运行完毕后temp中的数据就是 000000000110(即110),转化为16进制数据6。
    现在处理第二个分组数据,难道要用100101010110和 000011110000进行与运算,每次处理完一组用都要用一个新的数据(这里指000011110000)把100101010110的分组置换出来那不是很麻烦吗?幸好有移位运算符的帮助,只要把100101010110右移4位(语句③num=num>>4),就能得到新的数据 000010010101 ,再和 000000001111进行与运算就能把中间的分组0101置换出来,避免了每次都构造置换数据的麻烦。
     最后当每个分组都处理完毕了,那就只剩下全为0的数据,表示所有分组都已经处理完毕了,所以有语句①while( num>0 ) 。    那考一下各位读者理解了这个算法没有。如果想把十进制数98转换为16进制应该怎么修改程序1 呢?
什么,要重写算法!!!真正需要的是把语句int num=04526; 改为 int num=98即可。这个算法还是挺方便吧^-^
    读者可以尝试把这个算法改为转化为8进制的数据。
     最后重申一遍这个算法的核心思想:进制转换只是改变数据的显示形式,在计算机中存放的依然是原来的二进制数据。