package iamrescue.util;
import java.util.Arrays;
public class BaseConverter {
public static int[] convertBase(int[] original, int originalBase,
int returnBase) {
return convertBase(convertToDecimal(original, originalBase), returnBase);
}
public static int convertToDecimal(int[] original, int originalBase) {
int number = 0;
int currentValue = 1;
for (int i = original.length - 1; i >= 0; i--) {
number += original[i] * currentValue;
currentValue *= originalBase;
}
return number;
}
public static boolean[] convertToBinary(int decimal) {
int[] binary = convertBase(decimal, 2);
boolean[] returnArray = new boolean[binary.length];
for (int i = 0; i < binary.length; i++) {
returnArray[i] = binary[i] > 0;
}
return returnArray;
}
public static boolean[] convertToBinary(int[] original, int originalBase) {
return convertToBinary(convertToDecimal(original, originalBase));
}
public static int[] convertFromBinary(boolean[] binary, int returnBase) {
return convertBase(convertToDecimal(binary), returnBase);
}
public static int convertToDecimal(boolean[] binary) {
int number = 0;
int currentValue = 1;
for (int i = binary.length - 1; i >= 0; i--) {
if (binary[i]) {
number += currentValue;
}
currentValue *= 2;
}
return number;
}
public static int[] convertBase(int number, int returnBase) {
if (returnBase < 2) {
throw new IllegalArgumentException("Return base must be > 1");
}
if (number == 0) {
return new int[0];
}
int places = 1 + (int) (Math.log(number) / Math.log(returnBase));
if (places < 0) {
throw new IllegalArgumentException("Could not convert " + number
+ " to " + returnBase);
}
int[] returnNumber = new int[places];
int currentValue = 1;// (int) Math.pow(returnBase, places - 1);
for (int i = 1; i <= places - 1; i++) {
currentValue *= returnBase;
}
int remaining = number;
for (int i = 0; i < places; i++) {
returnNumber[i] = remaining / currentValue;
remaining %= currentValue;
currentValue /= returnBase;
}
return returnNumber;
}
public static int[] padToLength(int[] array, int length) {
if (length < array.length) {
throw new IllegalArgumentException("Array "
+ Arrays.toString(array) + " is already longer than "
+ length);
} else if (length == array.length) {
return array;
} else {
int[] newArray = new int[length];
int offset = length - array.length;
for (int i = 0; i < length; i++) {
if (i < offset) {
newArray[i] = 0;
} else {
newArray[i] = array[i - offset];
}
}
return newArray;
}
}
public static boolean[] padToLength(boolean[] array, int length) {
if (length < array.length) {
throw new IllegalArgumentException("Array "
+ Arrays.toString(array) + " is already longer than "
+ length);
} else if (length == array.length) {
return array;
} else {
boolean[] newArray = new boolean[length];
int offset = length - array.length;
for (int i = 0; i < length; i++) {
if (i < offset) {
newArray[i] = false;
} else {
newArray[i] = array[i - offset];
}
}
return newArray;
}
}
public static void main(String[] args) {
System.out.println("123 in binary: "
+ Arrays.toString(padToLength(convertBase(123, 2), 10)));
System.out.println("And back: "
+ Arrays.toString(padToLength(convertBase(convertBase(123, 2),
2, 10), 10)));
System.out.println("123 in oct: "
+ Arrays.toString(padToLength(convertBase(123, 8), 10)));
System.out.println("And back: "
+ Arrays.toString(padToLength(convertBase(convertBase(123, 8),
8, 10), 10)));
System.out.println("123 in base 5: "
+ Arrays.toString(padToLength(convertBase(123, 5), 5)));
System.out.println("And back: "
+ Arrays.toString(padToLength(convertBase(convertBase(123, 5),
5, 10), 10)));
int[] status = { 2, 2 };
System.out.println("2,2 to decimal: " + convertToDecimal(status, 3));
System.out.println("2,2 to binary: "
+ Arrays.toString(convertToBinary(status, 3)));
System.out.println("2,2 to binary: "
+ Arrays.toString(convertBase(status, 3, 2)));
}
}