一、二进制和十进制的转换
/**
* 十进制和二进制间的转换
*/
public class IntToBinary {
public static void main(String[] args) {
int a = -23422;
String str;
System.out.println("======================使用自己写的方法=============================");
str = intToBinaryString(a);
System.out.println(str);
System.out.println(binaryStringToInt(str));
System.out.println("======================使用Integer中的方法=============================");
str = Integer.toBinaryString(a);
System.out.println(str);
// System.out.println(Integer.parseInt(binaryString, 2)); //只能转换正数,转换负数报错
System.out.println(Integer.parseUnsignedInt(str, 2));
}
/**
* int转二进制字符串
*
* 算法一:除2取余
* 正数:除2取余-->倒序
* 负数(补码):先加1-->转换成正数-->除2取余,并取反-->高位补1-->倒序
* @param num 整数
*/
public static String intToBinaryString(int num){
StringBuilder stringBuilder = new StringBuilder();
boolean flag = false; //标志:true表示为负数
int rem;
if (num == 0){
return "0";
}else if(num < 0){
flag = true;
num = Math.abs (num + 1);
}
while (num != 0){
//正数,保持不变;负数,取反
rem = (!flag && num % 2 == 0) || (flag && num % 2 == 1) ? 0 : 1;
num = num / 2;
stringBuilder.append(rem);
}
//判断是否为负数,如果是负数,那么前面所有位补1
if(flag){
num = stringBuilder.length();
for(int i = 1; i <= 32 - num; i++){
stringBuilder.append("1");
}
}
return stringBuilder.reverse().toString();
}
/**
* int转二进制字符串
*
* 算法二:原数据的每一位和1进行与运算,判断1和0
* @param num 整数
*/
public static String intToBinaryString2(int num){
StringBuilder stringBuilder = new StringBuilder();
boolean flag = false; //标志:true表示为负数
for(int j=31;j>=0;j--) {
if (((1 << j) & num) != 0){
flag = true;
stringBuilder.append("1");
} else{
if (flag){
stringBuilder.append("0");
}
}
}
return stringBuilder.toString();
}
/**
* 二进制字符串转int
*
* 算法一:每位数字* 2的n-1次方,并相加
* @param binaryStr 二进制字符串
*/
public static int binaryStringToInt(String binaryStr){
int result =0, rem;
// //正序遍历
// for (int i = 0; i < binaryStr.length(); i++){
// char c = binaryStr.charAt(i);
// rem = c - '0';
//
// //使用Math.pow()方法,计算2的n-1次方
//// result += rem * (int) Math.pow(2, (binaryStr.length() - 1 - i));
//
// //使用位移,计算2的n-1次方
// result += rem << (binaryStr.length() - 1 - i);
// }
//倒序遍历
int _pow = 1;
for (int i = binaryStr.length() - 1; i >= 0 ; i--){
char c = binaryStr.charAt(i);
rem = c - '0';
result += rem * _pow;
// _pow = (int) Math.pow(2, (binaryStr.length() - i)); //使用Math.pow()方法,计算2的n-1次方
_pow = _pow << 1; //使用位移,计算2的n-1次方
}
return result;
}
/**
* 二进制字符串转int
*
* 算法二:使用二进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
* @param binaryStr 二进制字符串
*/
public static int binaryStringToInt2(String binaryStr){
int result =0, rem, temp;
for (int i = 0; i < binaryStr.length(); i++){
char c = binaryStr.charAt(i);
rem = c - '0'; //计算出二进制值0或1
//使用二进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
result = result * 2 + rem;
}
return result;
}
}
二、十六进制和十进制的转换
package com.wslook.algorithm.radix;
public class IntToHexString {
public static void main(String[] args) {
int a = 23422;
String str;
System.out.println("======================使用自己写的方法=============================");
str = intToHexString(a);
System.out.println(str);
// str = "ffffa482";
System.out.println(hexStringToInt2(str));
System.out.println("======================使用Integer中的方法=============================");
str = Integer.toHexString(a);
System.out.println(str);
// System.out.println(Integer.parseInt(binaryString, 16)); //只能转换正数,转换负数报错
System.out.println(Integer.parseUnsignedInt(str, 16));
}
/**
* int转十六进制字符串
*
* 算法一:先求出二进制字符串,再转换成十六进制字符串
* @param num 整数
*/
public static String intToHexString(int num){
String binaryStr = IntToBinary.intToBinaryString(num);
//二进制串转十六进制串
int count = binaryStr.length();
StringBuilder sb = new StringBuilder();
String subStr;
while (count > 0){
if (count <= 4){
subStr = binaryStr.substring(0, count);
}else {
subStr = binaryStr.substring(count - 4, count);
}
count -= 4;
int c = IntToBinary.binaryStringToInt2(subStr);
sb.append(trans(c));
}
return sb.reverse().toString();
}
/**
* 整数转十六进制字符串
* @param deci 小于16的正整数
* @return
*/
private static char trans(int deci){
if (deci < 10){
return (char) (deci + 48);
}
// return (char) (deci + 55); //转成大写A-F
return (char) (deci + 87); //转成小写a-f
}
/**
* 十六进制字符串转int
*
* 算法一:每位数字* 2的n-1次方,并相加
* @param str 十六进制字符串
*/
public static int hexStringToInt(String str){
int result = 0, rem = 0, _pow = 1;
//正序遍历字符串
for (int i = 0; i < str.length(); i++){
char hex = str.charAt(i);
if (hex >= '0' && hex <= '9'){
rem = hex - 48; //转换成数字0-9
}else if (hex >= 'a' && hex <= 'f'){
rem = hex - 87; //转换成数字10-15,'a'= 97
}else if (hex >= 'A' && hex <= 'F'){
rem = hex - 55; //转换成数字10-15,'A'= 65
}
//使用位移,计算16的n-1次方-----【16的n次方 = 1 << 4n】
_pow = (int) Math.pow(16, (str.length() - 1 - i));
// _pow = 1 << (4 * (str.length() -1 - i));
result += rem * _pow;
}
// //倒序遍历字符串
// for (int i = str.length() - 1; i >= 0; i--){
// char hex = str.charAt(i);
// if (hex >= '0' && hex <= '9'){
// rem = hex - 48;
// }else if (hex >= 'a' && hex <= 'f'){
// rem = hex - 87;
// }else if (hex >= 'A' && hex <= 'F'){
// rem = hex - 55;
// }
//
// //使用位移,计算16的n-1次方-----【16的n次方 = 2 << (4n -1)】
// result += rem * _pow;
//// _pow = (int) Math.pow(16, (str.length() - i));
// _pow = _pow << 4;
// }
return result;
}
/**
* 十六进制字符串转int
*
* 算法二:使用十六进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
* @param str 十六进制字符串
*/
public static int hexStringToInt2(String str){
int result =0, rem = 0, temp;
for (int i = 0; i < str.length(); i++){
char hex = str.charAt(i);
if (hex >= '0' && hex <= '9'){
rem = hex - 48; //转换成数字0-9
}else if (hex >= 'a' && hex <= 'f'){
rem = hex - 87; //转换成数字10-15,'a'= 97
}else if (hex >= 'A' && hex <= 'F'){
rem = hex - 55; //转换成数字10-15,'A'= 65
}
//使用十六进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
result = result * 16 + rem;
}
return result;
}
}