十进制、二进制相关转换
十进制(Integer) 转 二进制(String)
原生方法
------------------------------------------------------------------------
Integer 提供方法
------------------------------------------------------------------------
int num = 500;
# 将数字转换成 10 进制字符串
String s = Integer.toString(num); // 500
# 将数字转换成 2 进制字符串
String s1 = Integer.toBinaryString(num); // 111110100
String ss1 = Integer.toString(num, 2); // 111110100
# 将数字转换成 8 进制字符串
String s2 = Integer.toOctalString(num); // 764
String ss2 = Integer.toString(num, 8); // 764
# 将数字转换成 16 进制字符串
String s3 = Integer.toHexString(num); // 1f
String ss3 = Integer.toString(num, 16); // 1f
------------------------------------------------------------------------
String提供方法
适用于8进制,10进制,16进制,但不适用于二进制方法
------------------------------------------------------------------------
int num = 500;
# %d表示将整数格式化为10进制整数
String format = String.format("%d", num); // 500
# %o表示将整数格式化为8进制整数
String format1 = String.format("%o", num); // 764
# %x表示将整数格式化为16进制整数
String format2 = String.format("%x", num); // 1f4
# %X表示将整数格式化为16进制整数,并且字母变成大写形式
String format3 = String.format("%X", num); // 1F4
自定义方法
------------------------------------------------------------------------
递归直接输出
------------------------------------------------------------------------
/**
* 通常十进制转其他进制使用辗转相除法来求解,取余数的倒叙作为结果
* 如:例如302
* 302/2 = 151 余0
* 151/2 = 75 余1
* 75/2 = 37 余1
* 37/2 = 18 余1
* 18/2 = 9 余0
* 9/2 = 4 余1
* 4/2 = 2 余0
* 2/2 = 1 余0
* 1/2 = 0 余1
* 故二进制为100101110
*/
public static void fun(int num) {
int goInside = num / 2; // 当前数>=1就继续除以2
if (goInside >= 1) {
// 直到商为0停止
fun(goInside);
}
int remainder = num % 2; // 这就是对当前数取余数,别的没啥
System.out.print(remainder);
}
/**
* 验证:取余数和递归调用没联系,只是影响输出顺序而已
*/
public static void fun1(int num) {
int remainder = num % 2;
System.out.print(remainder);
int goInside = num / 2;
if (goInside >= 1) {
fun1(goInside);
}
}
fun(500); → 111110100 二进制
fun1(500); → 001011111 仅仅验证取余数和递归调用没联系
------------------------------------------------------------------------
递归收集到集合
------------------------------------------------------------------------
public static void fun1(Deque<Integer> res, int num) {
int goInside = num / 2;
if (goInside >= 1) {
fun1(res, goInside);
}
int remainder = num % 2; // 这就是对当前数取余数,别的没啥
res.addLast(remainder);
}
Deque<Integer> res = new LinkedList();
fun1(res, 500);
String collect = res.stream().map(String::valueOf).collect(Collectors.joining(""));
System.out.println(collect); // 111110100
System.out.println(Integer.toBinaryString(500)); // 111110100
------------------------------------------------------------------------
递归拼接为String
------------------------------------------------------------------------
public static String fun3(int num) {
if (num == 0) {
// 商为0停止
return "";
}
int remainder = num % 2; // 这就是对当前数取余数,别的没啥
return fun3(num / 2) + remainder;
}
String s = fun3(500);
System.out.println(s); // 111110100
System.out.println(Integer.toBinaryString(500)); // 111110100
二进制(string) 转 十进制(int)
------------------------------------------------------------------------
# res = res * 2 + numericValue;
------------------------------------------------------------------------
public static void binaryToDecimal3(String binaryint) {
int res = 0; // 结果收集器
char[] chars = binaryint.toCharArray();
for (int i = 0; i < chars.length; i++) {
int numericValue = Character.getNumericValue(chars[i]); // 获取1或者0,防止转成ASCLL码
res = res * 2 + numericValue; // 公式2
}
System.out.println("这个二进制的十进制数为:" + res);
}
------------------------------------------------------------------------
# res += numericValue * Math.pow(2, index++);
------------------------------------------------------------------------
public static void binaryToDecimal2(String binaryint) {
int res = 0; // 结果收集器
int index = 0; // 遍历圈数
char[] chars = binaryint.toCharArray();
for (int i = chars.length - 1; i >= 0; i--) {
int numericValue = Character.getNumericValue(chars[i]); // 获取1或者0,防止转成ASCLL码
res += numericValue * Math.pow(2, index++); // 公式1
}
System.out.println("这个二进制的十进制数为:" + res);
}
二进制(Integer) 转 十进制(Integer)
public static void binaryToDecimal1(int binaryint) {
int res = 0; // 结果收集器
int remainder = 0; // 余数
int index = 0; // 遍历圈数
while (binaryint != 0) {
remainder = binaryint % 10;//取余,从二进制后面的数先开始
binaryint /= 10; // 为下一轮做准备,比如1111,得到111
res += remainder * Math.pow(2, index++);
}
System.out.println("这个二进制的十进制数为:" + res);
}
binaryToDecimal2("1001101");
binaryToDecimal3("1001101");
binaryToDecimal1(1001101);
这个二进制的十进制数为:77
这个二进制的十进制数为:77
这个二进制的十进制数为:77
十六进制 转 十进制
private static Map<Character, Integer> map = new HashMap<>() {
{
put('0', 0);
put('1', 1);
put('2', 2);
put('3', 3);
put('4', 4);
put('5', 5);
put('6', 6);
put('7', 7);
put('8', 8);
put('9', 9);
put('A', 10);
put('B', 11);
put('C', 12);
put('D', 13);
put('E', 14);
put('F', 15);
put('a', 10);
put('b', 11);
put('c', 12);
put('d', 13);
put('e', 14);
put('f', 15);
}};
public static void hexToDecimal1(String number) {
number = number.substring(2); // 去掉ox
int res = 0;
for (char ch : number.toCharArray()) {
res = res * 16 + map.get(ch);
}
System.out.println(res);
}
public static void hexToDecimal2(String number) {
number = number.substring(2); // 去掉ox
int res = 0;
int index = 0;
char[] chars = number.toCharArray();
for (int i = chars.length - 1; i >= 0; i--) {
res += map.get(chars[i]) * Math.pow(16, index++);
}
System.out.println(res);
}
hexToDecimal1("0xAA"); // 170
hexToDecimal2("0xAA"); // 170
参考
Java中二进制转换的多种方法
还没有评论,来说两句吧...