楼上找博客,我不同,我给你手敲!等我几分钟!
坐等大佬代码 , 博客还在实验
@哎哟,不错哦: 你的负数应该是指无符号的负数16进制把
@Shendu.cc: 嗯嗯 是的大佬 麻烦大佬把16进制转10进制的工具类也给发出来
@哎哟,不错哦:
我把十进制整数,负数转十六进制的写了,这个是最难的
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: 大佬 请问有反转回来的方法没有
@哎哟,不错哦: 有的,我就是有个疑问,你的负十六进制转十进制
是指加符号的-AA 还是说,没有负十六进制的需求。
@Shendu.cc: 没有这个 “-”负号的
@哎哟,不错哦: 那就是说十六进制转十进制是没有负十六进制的咯
@Shendu.cc: 有负数 但是 不会出现 - 负数这个符合
@哎哟,不错哦: 比如我-3 转出的16进制是FFFFFFFD 。但是给你FFFFFFFD,你怎么判断他是正的还是负的?FFFFFFFD 也可以是15*16^7+15*16^6+.....13*16^0 啊
@Shendu.cc: 大佬 你按照你想的先写一下吧 具体协议明天才知道
@哎哟,不错哦: 你等我
@哎哟,不错哦: 更新之后的代码:
这里要和你说明一下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); } } }
大佬 你这只针对正整数,如果是负数就不行了
@哎哟,不错哦: 参考 Java 十进制和十六制之间的转化(负数的处理)
@dudu: 这个我测试过了 不管用
@哎哟,不错哦: 再来一篇:Java进制转换(无视正负数的差别)
@dudu: 大佬用你最后分享这个我也转了 负数也重16进制转到2进制 看着是没什么问题 但是我从2进制转到10进制的时候出错了
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; } }