如题,题目要求编程实现十进制向二进制,八进制,十六进制的准换。
代码如下:
- /**
- *
- * @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()来实现三者的共同处,在回调即可.
大致思路就是这样吧.
本文出自 “IvanTian” 博客,转载请与作者联系!