我知道将任何基地转换为任何基地都很简单。首先,将任何base转换为decimal,然后将decimal转换为任何其他base。但是,我之前已经完成了2到36的范围,但从未完成2到46次。
我不明白我将在36之后放什么,因为36表示'z'(1-10是十进制数字,然后是字母表的26个字符)。
请解释36之后会发生什么。
答案 0 :(得分:5)
用于数字的符号是任意的。例如,base64编码使用'A'表示零值数字,'0'表示值为52的数字。在base64中,数字通过字母AZ,然后是小写字母az,然后是传统数字0-9 ,然后通常是'+'和'/'。
一个基础60系统使用了这些符号:
所以使用的符号是任意的。除了你说你的系统所发生的事情之外,没有任何事情在36之后“发生”。
答案 1 :(得分:5)
每个基地都有目的。通常我们进行基本转换以使复杂计算更简单。
以下是一些最受欢迎的基地及其代表。
2二进制数字系统
几乎所有计算机都在内部使用,是基础二。两个数字分别为0
和1
,分别显示为OFF和ON。 八进制系统
偶尔用于计算。八位数字为0–7
。
10十进制
世界上最常用的数字系统,用于算术。它的十位数是0–9
。
12-duodecimal(dozenal)系统
经常被使用,因为可分为2,3,4和6.它通常被用作数十和十字表示的数量的一部分。
16十六进制系统
经常用于计算。十六位数字为0–9
,后跟A–F
。
60-sexagesimal系统
起源于古代的苏美尔,并传给了巴比伦人。它仍然是我们现代圆形坐标系(度,分和秒)和时间测量(分钟和小时)的基础。
64-Base 64
偶尔也会用于计算,使用数字A–Z,
a–z,
0–9
以及另外两个字符,通常是+
和/
。
<强> 256字节强>
由计算机内部使用,实际上将八个二进制数字组合在一起。对于人类阅读,字节通常以十六进制显示。
八进制,十六进制和base-64系统经常用于计算,因为它们易于作为二进制的简写。例如,每个十六进制数字都具有等效的4位二进制数。
Radices通常是自然数。然而,其他定位系统也是可能的,例如,黄金比率基数(其基数是非整数代数数)和负基数(基数为负数)。
您的疑问是,在基数超过36之后,我们是否可以将任何基地转换为任何其他基地 (字母数+ +数字数= 26 + 10 = 36)
以64-Base为例 它使用A-Z(大写)(26),a-z(小写)(26),0-9(10),再加上2个字符。这样就解决了36的约束。
由于我们有64个基数的(26 + 26 + 10 + 2)个64个符号用于表示,我们可以表示64个碱基中的任何数字。同样,对于更多的基础,他们使用不同的符号进行表示。
答案 2 :(得分:2)
使用数字系统,你可以扮演上帝。
您需要了解的是,符号完全是任意的。对于“36后会发生什么”,没有上帝给予的规则。您可以随意定义自己喜欢的内容。
要对具有特定基数的数字进行编码,您只需要以下内容:
当然,为某个基础创建这样的符号表有无限的可能性:
Θ
ェ
す
)
0
・
_
o
や
ι
你可以使用它来编码基数为10的数字。Θ
是零元素,ェ
是一个,等等。
当然,如果你开始使用上面的符号表,你的同行也不会太高兴。因为符号是任意的,我们需要约定。 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
是一个约定,我们用于十六进制,二进制等的符号也是如此。人们普遍同意我们使用什么符号表作为基础,这就是为什么我们可以读取别人写下的数字。< / p>
答案 3 :(得分:1)
要记住的重要一点是,所有数字都是价值的象征。因此,如果您想这样做,您只需创建一个包含每个位置值的列表。在36之后,你只需要用完你可以制作逻辑顺序的字符。例如,如果您使用带有70个奇数字符的柬埔寨字母,则可以使用80。
答案 4 :(得分:0)
这是我写的完整代码,希望这会有所帮助。
import java.util.Scanner;
/*
* author : roottraveller, nov 4th 2017
*/
public class BaseXtoBaseYConversion {
BaseXtoBaseYConversion() {
}
public static String convertBaseXtoBaseY(String inputNumber, final int inputBase, final int outputBase) {
int decimal = baseXToDecimal(inputNumber, inputBase);
return decimalToBaseY(decimal, outputBase);
}
private static int baseXNumeric(char input) {
if (input >= '0' && input <= '9') {
return Integer.parseInt(input + "");
} else if (input >= 'a' && input <= 'z') {
return (input - 'a') + 10;
} else if (input >= 'A' && input <= 'Z') {
return (input - 'A') + 10;
} else {
return Integer.MIN_VALUE;
}
}
public static int baseXToDecimal(String input, final int base) {
if(input.length() <= 0) {
return Integer.MIN_VALUE;
}
int decimalValue = 0;
int placeValue = 0;
for (int index = input.length() - 1; index >= 0; index--) {
decimalValue += baseXNumeric(input.charAt(index)) * (Math.pow(base, placeValue));
placeValue++;
}
return decimalValue;
}
private static char baseYCharacter(int input) {
if (input >= 0 && input <= 9) {
String str = String.valueOf(input);
return str.charAt(0);
} else {
return (char) ('a' + (input - 10));
//return ('A' + (input - 10));
}
}
public static String decimalToBaseY(int input, int base) {
String result = "";
while (input > 0) {
int remainder = input % base;
input = input / base;
result = baseYCharacter(remainder) + result; // Important, Notice the reverse order here
}
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter : number baseX baseY");
while(true) {
String inputNumber = scanner.next();
int inputBase = scanner.nextInt();
int outputBase = scanner.nextInt();
String outputNumber = convertBaseXtoBaseY(inputNumber, inputBase, outputBase);
System.out.println("Result = " + outputNumber);
}
}
}