⼆进制、⼗六进制和⼗进制的转换算法⼀、⼆进制和⼗进制的转换
/**
* ⼗进制和⼆进制间的转换
*/
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 = BinaryString(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");
}
}
verse().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");
}
}
}
String();
}
/**
* ⼆进制字符串转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 = HexString(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));
}
verse().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;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论