实例编程:十进制之间的转换 如题,题目要求编程实现十进制向二进制,八进制,十六进制的转换。 代码如下: /** * * @author TianHaoYu * 实现十进制到二进制,八进制,十六进制的转换 * 依 int 类型数据作为示例 * */ public class ToBinaryOperate { public static void transfor(int number,int base,int offSet){ /*number 为 0 不做任何操作 */ if(number == 0){ System.out.println(number+"任意进制数值均为 0!"); return; } char[] chars = { '0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F' }; /*创建临时数组 存储 转化后的字符值*/ char[] arr = new char[32]; /*记录 arr 中元素的位置*/ int index = arr.length; /*保留原始数值*/ int num = number; /*实现进制之间的转换*/ while(number != 0){ int temp = number & base; // base 为进制的基值 可取的是: 1,07,0xF arr[--index] = chars[temp]; number = number>>>offSet; // 右移的位数, 依次为: 1,3,4 } /*实现输出格式,用 str 来记录输出格式语句*/ String str = "十进制:"; switch(base){ case 1: str += (num + " 的二进制是:["); break; case 07: str += (num + " 的八进制是:[O"); break; case 0xF: str += (num + " 的十六进制是:[0x"); break; default: break; } /*格式化输出 arr 中的值*/ System.out.print(str); for(int x = index ; x < arr.length; x ++){ System.out.print(arr[x]); } System.out.println("]"); } /*十进制 ->二进制*/ static void toBinary(int number){ transfor(number, 1, 1); } /*十进制 ->八进制*/ static void toOctal(int number){ transfor(number, 07, 3); } /*十进制->十六进制*/ static void toHex(int number){ transfor(number,0xF,4); } public static void main(String[] args) { /* 测试 实例*/ /*正数*/ System.out.println("============以下是正数的输出==========="); toBinary(45); toOctal(45); toHex(45); System.out.println("==============以下是 0 的输出==========="); /*零*/ toBinary(0); toOctal(0); toHex(0); /*负数*/ System.out.println("============以下是负数的输出==========="); toBinary(-45); toOctal(-45); toHex(-45); } } 输出结果如下: /* ============以下是正数的输出=========== 十进制:45 的二进制是:[101101] 十进制:45 的八进制是:[O55] 十进制:45 的十六进制是:[0x2D] ==============以下是 0 的输出=========== 0 任意进制数值均为 0! 0 任意进制数值均为 0! 0 任意进制数值均为 0! ============以下是负数的输出=========== 十进制:-45 的二进制是:[11111111111111111111111111010011] 十进制:-45 的八进制是:[O37777777723] 十进制:-45 的十六进制是:[0xFFFFFFD3] */ 以上的版本是最终的版本且 测试 通过的,在这个代码的实现过程中其实是一步步来的。 1,先写了一个十进制转换二进制的程序,输出格式和结果都不太理想,且还不能支持负数的输入。 2,后先解决了十进制与二进制的转换。 3,本打算用十进制数除于 8 或者 16 来完成操作,但仔细想,3 位二进制可以表示为一个 8 进制,4 位二进制可以表示为一个 16 进制。且十进制的 int 类型在内存中是一个 32 位的二进制,就用移位和&操作。 4,并且一个数的二进制位和 其他进制基数(当然他们也是二进制位)进行&操作,所得到的结果正好与 chars 数组中的每一个元素相对应。eg: 25 & 0xF ,过程如下: 第一步: 25 的二进制表达是: [0000-0000-0000-0000-0000-0000-0001-1001] & 0xF 的二进制表达是:[0000-0000-0000-0000-0000-0000-0000-1111] --------------------------------------------------------------------- [0000-0000-0000-0000-0000-0000-0000-1001] 结果表示为十六进制就是:9 第二步: 接下来将 25 的二进制位右移 4为:[0000-0000-0000-0000-0000-0000-0000-0001] & 0xF 的二进制表达是:[0000-0000-0000-0000-0000-0000-0000-1111] --------------------------------------------------------------------------- [0000-0000-0000-0000-0000-0000-0000-0001] 结果表示为十六进制就是:1 第三步,再接着右移的话,全是 25 的高位上的 0,没有操作意义,操作结束. 第四步:每一次&出的结果值,不管一位与否,chars[9] = 9 chars[1]=1 char[] chars = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; 所以 arr[--index] = chars[temp] ,temp 是在程序中保存 & 操作的结果的. 25 的十六进制表达就是: 0x19 转换为八进制原理亦如此。 4, 原本程序中写了具有重复结构的三个转换函数 toBinary(),toOctal()和 toHex(),觉得太过于繁琐,就抽取出来一个方法 transfor()来实 现三者的共同处,在回调即可。 大致思路就是这样吧。