java 10进制转16进制

昨天研究了一下java中如何讲int的10进制数,转换成16进制,这里和大家分享一下,自己也做下整理,写的一般,如果有更好的算法,或者有现成的类库,请在评论留言,大家一起进步

废话不多说,上代码

/**我的思路是先将输入的10进制数转换成2进制,再讲2进制转成16进制*/
public static byte[] int10ToInt16Convert(Integer source) {
       return int2ToInt16Convert(   
               int10ToInt2Convert(source)
       );
   }
  • 10进制转2进制(32位)
/**
*将对比数的首位1每次右移一位,与原int数进行按位与运算,由于对比数只有一位为1,
*所以原int数中只有与当前对比数1所在位对应的位上是1,整个与运算结果才非0
*而i就是当前的位数,所以循环后就可以得出每一位的2进制数了
*/
    private final static int PAN_DING_FU = 0x80000000;  //16进制的对比数,二进制为1000 0000 0000 0000 0000 0000 0000 000
    private final static int INT_LENGTH = 32;   //int类型的长度为32位
    private static byte[] int10ToInt2Convert(Integer source) {
        byte[] target = new byte[INT_LENGTH];   //将目标2进制的每一位存入byte数
        for (int i = PANG_DING_FU, j = 0; i != 0; i >>>= 1) {
            target[j] = (byte) ((source & i) == 0 ? 0 : 1);
            j++;
        }
        return target;
    }
  • 2进制转16进制
private static byte[] int2ToInt16Convert(byte[] source) {
        byte[] target = new byte[8]; // 32位的2进制对应的16进制是8位(4位为一组)
        int i = 0;
        for (i = 3; i < INT_LENGTH; i += 4) {  //4位为一组,每次递增4 ,从3开始,0123位一组,4567为一组,以此规则遍历2进制数组参数
            byte result = 0;     //内层循环是为了把每组二进制转换成(0-16)的10进制((abcd)2 = (a*2^3+b*2^2+c*2+d))
            for (int j = 3; j >= 0; j--) {    
                byte b = source[i - j];  //由于每次的i都是当前组最大的下标,所以采用减法倒叙输出 以0123 组为例 分别是3-3->0 ,3-1->2,3-2->1,3-3->0;
                result += b << j;
            }
            target[(i) / 4] = convert16Token(result);  //(见下一节)
                // 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,a,b,c,d,e,f
        }
        return target;
    }
  • 将10进制数转换成16进制标识
    private static byte convert16Token(byte source) {
        if (source > 15 || source < 0)
            throw new IllegalArgumentException("只接受0-15的值");
        if (source >= 0 && source < 10)   //如果0到10原样输出
            return source;
        if (source >= 10 && source < 16) {  //10到16转化成相应的字母
            byte target = 0;
            switch (source) {
                case 10:
                    target = 'a';  //注入,这里byte存字母存的是其ASCII码
                    break;
                case 11:
                    target = 'b';
                    break;
                case 12:
                    target = 'c';
                    break;
                case 13:
                    target = 'd';
                    break;
                case 14:
                    target = 'e';
                    break;
                case 15:
                    target = 'f';
                    break;
            }
            return target;
        }
        return -1;
    }
  • mian方法进行测试
 public static void main(String[] args) {
        System.out.println("请输入要转换的数字,按回车开始转换,按-1结束:");
        Scanner scanner = new Scanner(System.in);
        Integer source = scanner.nextInt();
        while (source != -1) {
            print(int10ToInt16Convert(source));  //print方法打印16进制的byte数组
            source = scanner.nextInt();
        }
    }

/**这里如果需要保存16进制的字符串可以将System.out.print换成StringBuiler进行拼接**/
    private static void print(byte[] bytes) {   
        System.out.print("0x");  //16进制0x标识
        boolean is_first = false;
        for (byte b : bytes) {
            if (b != 0&&!is_first)  //第一个非0位之前的0都不输出
                is_first = true; //用is_first做一个标志位
            if (is_first) {
                if (b < 10)  //如果小于10原样输出
                    System.out.print(b + "");
                else //否则转换为char字符输出
                    System.out.print((char) b + "");
            }

        }
    }

最后附上测试结果

测试结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

屌炸天,JDK8的排序大法!!

首先祝大家端午节快乐! 今天总结了下JDK中排序的方法,包括JDK8中强大的lambda表达式及函数式接口运用,不废话,请看下面示例。 public class...

27460
来自专栏landv

从零开始学C#——基本语法(二)

14920
来自专栏大内老A

yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[下篇]

昨天写了《yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[上篇]》,引起了一些讨论。关于yield关键字这个语法糖背后的原理(C#编译器将它...

20480
来自专栏林德熙的博客

win10 uwp 如何判断一个对象被移除

有时候需要知道某个元素是否已经被移除,在优化内存的时候,有时候无法判断一个元素是否在某个地方被引用,就需要判断对象设置空时是否被回收。 本文告诉大家一个简单的方...

8410
来自专栏牛客网

知识总结:Java集合对象排序1.List排序2.Set排序 3.Map排序

1.List排序 这个和数组的排序又不一样了。 其实Java针对数组和List的排序都有实现,对数组而言,你可以直接使用Arrays.sort,对于List和V...

1.3K100
来自专栏yl 成长笔记

c# typeof 与 GetType 作用与区别

Used to obtain the "System.Type" object for a type. A 'typeof‘ expression takes ...

33510
来自专栏坚毅的PHP

golang使用 mongo

 连接集群 mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:por...

33150
来自专栏恰童鞋骚年

《C#图解教程》读书笔记之五:委托和事件

  (1)本质:持有一个或多个方法的对象;委托和典型的对象不同,执行委托实际上是执行它所“持有”的方法。如果从C++的角度来理解委托,可以将其理解为一个类型安全...

9620
来自专栏GreenLeaves

JavaScript之JSON

一、简介:Json是JavaScript中读取结构化数据更好的方式。因为Json数据可以直接传给eval(),而且不必创建DOM对象。Json是一种数据格式,不...

28170
来自专栏林德熙的博客

C# 6.0 字符串 String Interpolation

本文主要:C# 6.0 新特性 String Interpolation,一些比较少知道的知识。 本文内容有:字符串新特性的一般使用、格式化字符串、保留小数点、...

10930

扫码关注云+社区

领取腾讯云代金券