首页 新闻 会员 周边 捐助

java代码十进制转和十六进制相互转化

0
悬赏园豆:50 [已解决问题] 解决于 2018-03-23 15:10

希望大佬能给一个十进制和十六进制相互转化的代码要纯java的 可以处理负数的

哎哟,不错哦的主页 哎哟,不错哦 | 初学一级 | 园豆:184
提问于:2018-03-22 15:07
< >
分享
最佳答案
0

楼上找博客,我不同,我给你手敲!等我几分钟!

收获园豆:50
Shendu.CC | 老鸟四级 |园豆:2138 | 2018-03-22 16:24

坐等大佬代码 , 博客还在实验

哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 16:25

@哎哟,不错哦: 你的负数应该是指无符号的负数16进制把

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-03-22 17:15

@Shendu.cc: 嗯嗯 是的大佬 麻烦大佬把16进制转10进制的工具类也给发出来

哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 17:17

@哎哟,不错哦: 

我把十进制整数,负数转十六进制的写了,这个是最难的

package com.company;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.math.*;
import java.util.*;


public class Main {

    public static void main(String[] args) {
    // write your code here
       // HashMap<String,HashMap<String,String>> m = new HashMap<>();
    Scanner input = new Scanner(System.in);
    x=input.nextInt();
    DemtoBin(x);
    BintoHex();
    for(int i=pos2-1;i>=0;i--)
        System.out.print(hex[i]);

    System.out.println();
    }


    static int bin[] = new int[10000];
    static char hex[] = new char [10000];
    static int pos2=0;
    static int pos =32;
    static int pos3 =0;
    static int x;

    static void  DemtoBin(int x) {

        //先转换为二进制
        int y = Math.abs(x);
        pos3=0;
        while(y>0)
        {
            bin[pos3++]=y%2;
            y/=2;
        }



        //如果为负数,要进行反码
        if (x < 0) {
            for (int i = 0; i < pos; i++) {
                bin[i] = (bin[i] == 1 ? 0 : 1);
            }
            //加1
            int xx = 1;
            for (int i = 0; i < pos; i++) {
                bin[i] += xx;
                if (bin[i] == 2) {
                    bin[i] = 0;
                    xx = 1;
                } else
                    xx = 0;
            }
            if(xx==1)
                bin[pos++]=xx;
        }

    }
    static char change(int x)
    {
        if(x>=0&&x<=9)
        {
            return (char)(x+48);
        }
        else if(x==10)
            return 'A';
        else if(x==11)
            return 'B';
        else if(x==12)
            return 'C';
        else if(x==13)
            return 'D';
        else if(x==14)
            return 'E';
        else if(x==15)
           return 'F';
        else
            return 'G';


    }
    //二进制转16进制
    static void BintoHex()
    {
        int len;
        if(x<0)

            len = pos;
        else
            len =pos3;

            int j=0;int res=0;
            for(int i=0;i<len;i++)
            {

                res+=Math.pow(2.0,j)*bin[i];
                j++;
                if(j==4)
                {
                    hex[pos2++]=change(res);
                    res =0;
                    j=0;
                }
            }

            if(j!=0)
            {
                hex[pos2++]=change(res);
                
            }

    }
}
Shendu.CC | 园豆:2138 (老鸟四级) | 2018-03-22 17:45

@Shendu.cc: 大佬 请问有反转回来的方法没有

哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 17:47

@哎哟,不错哦: 有的,我就是有个疑问,你的负十六进制转十进制

是指加符号的-AA 还是说,没有负十六进制的需求。

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-03-22 17:50

@Shendu.cc: 没有这个 “-”负号的

哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 17:51

@哎哟,不错哦: 那就是说十六进制转十进制是没有负十六进制的咯

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-03-22 18:01

@Shendu.cc:   有负数 但是 不会出现  - 负数这个符合

哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 18:08

@哎哟,不错哦: 比如我-3 转出的16进制是FFFFFFFD 。但是给你FFFFFFFD,你怎么判断他是正的还是负的?FFFFFFFD 也可以是15*16^7+15*16^6+.....13*16^0 啊

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-03-22 18:11

@Shendu.cc: 大佬 你按照你想的先写一下吧  具体协议明天才知道 

哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 18:14

@哎哟,不错哦: 你等我

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-03-22 18:50

@哎哟,不错哦: 更新之后的代码:

这里要和你说明一下16进制的负数。在计算机中二进制的第一位是否为1用来表示符号,所以判断是否是负数,看这个16进制转成二进制之后,首位是否为1(在32位下,二进制必须是32位,如果不够的话需要在前面补0) 那么很显然FFFFFFFD 的二进制是1111 1111 1111 。。。。是一个负数

 详情请看下面这篇博客,喜欢的话记得点赞哦:

http://www.cnblogs.com/dacc123/p/8626247.html

package com.company;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.math.*;
import java.util.*;


public class Main {


    static int Bin[] = new int[1000];
    static char Hex[] = new char[1000];
    static int _pos=0;
    static int Change(char x)
    {
        if(x>='0'&&x<='9')
            return x-'0';
        else if(x=='A')
            return 10;
        else if(x=='B')
            return 11;
        else if(x=='C')
            return 12;
        else if(x=='D')
            return 13;
        else if(x=='E')
            return 14;
        else if(x=='F')
            return 15;
        else
            return 16;

    }
    //十六进制转二进制
    static void HextoBin()
    {
        for(int i=0;i<Hex.length;i++)
        {
            int x= Change(Hex[i]);
            int j=0;
            _pos+=4;
            while(x>0)
            {
                Bin[--_pos]=x%2;
                x/=2;
                j++;
            }
            _pos+=j;

        }
        //是负数要减1再进行反码
        if(Hex.length==8&&Hex[0]>='8')
        {
            int xx =-1;
            for(int i=_pos-1;i>=0;i--)
            {
                Bin[i]+=xx;

                if(Bin[i]==-1)
                {
                    Bin[i]=1;
                    xx =-1;
                }
                else
                    xx=0;

            }
            for(int i=0;i<_pos;i++)
            {
                Bin[i]=(Bin[i]==1?0:1);
            }

        }
    }

    static int BintoDem()
    {
        int x=0;
        for(int i=_pos-1;i>=0;i--)
        {
            x+=(Bin[i]*((int)Math.pow(2.0,_pos-1-i)));
        }
        return x;
    }


    public static void main(String[] args) {
    // write your code here
       // HashMap<String,HashMap<String,String>> m = new HashMap<>();
        System.out.println("**********输入数字,输出16进制数");
    Scanner input = new Scanner(System.in);
    x=input.nextInt();
    DemtoBin(x);
    BintoHex();
    for(int i=pos2-1;i>=0;i--)
        System.out.print(hex[i]);

    System.out.println();

    //16进制为负数,必须是8位,且第一位是大于等于8的
    System.out.println("***********输入16进制数,输入数字");

        Hex=input.next().toCharArray();
        HextoBin();
       int x= BintoDem();
        if(Hex.length==8&&Hex[0]>='8')
        {
            System.out.println("-"+x);
        }
        else
            System.out.println(x);

    }


    static int bin[] = new int[10000];
    static char hex[] = new char [10000];
    static int pos2=0;
    static int pos =32;
    static int pos3 =0;
    static int x;

    static void  DemtoBin(int x) {

        //先转换为二进制
        int y = Math.abs(x);
        pos3=0;
        while(y>0)
        {
            bin[pos3++]=y%2;
            y/=2;
        }



        //如果为负数,要进行反码
        if (x < 0) {
            for (int i = 0; i < pos; i++) {
                bin[i] = (bin[i] == 1 ? 0 : 1);
            }
            //加1
            int xx = 1;
            for (int i = 0; i < pos; i++) {
                bin[i] += xx;
                if (bin[i] == 2) {
                    bin[i] = 0;
                    xx = 1;
                } else
                    xx = 0;
            }
            if(xx==1)
                bin[pos++]=xx;
        }

    }
    static char change(int x)
    {
        if(x>=0&&x<=9)
        {
            return (char)(x+48);
        }
        else if(x==10)
            return 'A';
        else if(x==11)
            return 'B';
        else if(x==12)
            return 'C';
        else if(x==13)
            return 'D';
        else if(x==14)
            return 'E';
        else if(x==15)
           return 'F';
        else
            return 'G';


    }
    //二进制转16进制
    static void BintoHex()
    {
        int len;
        if(x<0)

            len = pos;
        else
            len =pos3;

            int j=0;int res=0;
            for(int i=0;i<len;i++)
            {

                res+=Math.pow(2.0,j)*bin[i];
                j++;
                if(j==4)
                {
                    hex[pos2++]=change(res);
                    res =0;
                    j=0;
                }
            }

            if(j!=0)
            {
                hex[pos2++]=change(res);
                
            }

    }
}
Shendu.CC | 园豆:2138 (老鸟四级) | 2018-03-22 19:47
其他回答(2)
0
dudu | 园豆:30257 (高人七级) | 2018-03-22 15:53

大佬 你这只针对正整数,如果是负数就不行了 

支持(0) 反对(0) 哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 15:58
支持(0) 反对(0) dudu | 园豆:30257 (高人七级) | 2018-03-22 16:00

@dudu: 这个我测试过了 不管用

支持(0) 反对(0) 哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 16:01

@哎哟,不错哦: 再来一篇:Java进制转换(无视正负数的差别)

支持(0) 反对(0) dudu | 园豆:30257 (高人七级) | 2018-03-22 16:11

@dudu: 大佬用你最后分享这个我也转了 负数也重16进制转到2进制 看着是没什么问题 但是我从2进制转到10进制的时候出错了

支持(0) 反对(0) 哎哟,不错哦 | 园豆:184 (初学一级) | 2018-03-22 16:35
0
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        Demo d = new Demo();
        byte[] result = d.getIntBit(x);
        for(int i = 0; i < 32; i++)
            System.out.print(result[i]);
        System.out.println();
        String s = d.toHex(result);
        System.out.println(s);
        System.out.println(d.toDec(s));
    }

    /** 
    * 将byte转换为一个长度为32的byte数组,数组每个值代表bit
    */  
    public byte[] getIntBit(int b) {  
        byte[] array = new byte[32];  
        for (int i = 31; i >= 0; i--) {  
            array[i] = (byte)(b & 1);  
            b = (byte) (b >> 1);  
        }  
        return array;  
    }  
    /**
     * 转16进制
     */
    public String toHex(byte[] b) {
        String s = "";
        //每四位处理一次
        for(int i = 0; i < 32; i += 4) {
            int temp = (b[i] * 8  + b[i+1] * 4 + b[i+2] * 2 + b[i+3]);
            
            if(temp > 9) {
                //=>A:65 -> 10 + 55 = 65
                temp += 55;
                s += (char)temp;
            }else {
                s += temp;
            }
        }
        return s;
    }
    /**
     * 转十进制
     */
    public int toDec(String s) {
        int result = 0;
        for(int i = 0; i < 8; i++) {
            int temp = s.charAt(i);
            //9的ascii为57
            if(temp > 57) {
                temp -= 55; //'A'为65对应10,故减去55
            }else {
                temp -= 48;
            }
            result += temp * getProduct(7 - i);
        }
        return result;
    }
    /**
     * 计算16的n次方 
     */
    public int getProduct(int n) {
        int result = 1;
        for(int i = 0; i < n; i++) {
            result *= 16;
        }
        return result;
    }
}
View Code
web_小隆 | 园豆:169 (初学一级) | 2018-03-23 09:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册