一、二進制和十進制的轉換
/**
* 十進制和二進制間的轉換
*/
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;
}
}