是否有可能将任何进制转换为任何进制(范围在2到46之间)?

3
我知道将任何进制转换为任何进制都是简单而可行的。首先将任何进制转换为十进制,然后再将十进制转换为任何其他进制。但是,我曾经将范围从2到36的进制进行过转换,但从2到46的进制我从未尝试过。
我不明白在36之后该放什么,因为36代表字母'z'(1-10是十进制数字,然后是26个字母)。
请解释一下36之后会发生什么。

7
有时候,你只能发明符号或使用来自其他字母表的符号。 - juanchopanza
3
或者使用大写字母,如Base64编码。 - L.B
1
你的意思是我应该先添加26个小写字母,然后再添加10个大写字母吗?我理解得对吗? - user1542653
6
在转换到其他进制之前,无需将数字转换为十进制。我猜这会更容易,因为你习惯于在十进制中进行计算,但这并非必要。至于数字符号,只需创造一些即可。 - Ivaylo Strandjev
4
在我的(瑞典)键盘上,总共有106个字母、数字和其他符号。去掉三个瑞典字母后,我可以使用高达100进制。这只是在键盘上的情况,现在想象一下完整的Unicode范围中成千上万的字母和符号,您可以拥有非常大的进制数。 - Some programmer dude
显示剩余4条评论
5个回答

5
您用来表示数字的符号是任意的。例如,base64编码使用'A'来表示值为零的数字,而'0'表示值为52的数字。在base64中,数字通过字母表A-Z、小写字母a-z、传统数字0-9以及通常的'+'和'/'进行排列。

一种base 60系统使用这些符号:babalonian numerals

因此,使用的符号是任意的。除了您的系统之外,36之后没有任何特殊含义。


5
每个基数都有一个特定用途。通常我们进行基数转换是为了使复杂计算变得更简单。
下面是一些最常用的基数及其表示方法:
- 二进制数字系统:几乎所有计算机内部使用的是二进制,即基于2的数字系统。该系统只有两个数字:0和1,它们分别代表着关闭和打开。 - 八进制系统:有时在计算中会使用八进制,其8个数字为0到7。 - 十进制系统:作为世界上最常用的数字系统,被用于算术运算。它的10个数字为0到9。 - 十二进制(打印单位)系统:由于可被2、3、4和6整除,经常被使用。传统上,它被用作数量中打印单位和总数的表示方式。 - 十六进制系统:在计算中经常使用。16个数字为0到9,后跟A到F。 - 六十进制系统(角分秒制):起源于古代苏美尔并流传至巴比伦。仍然用作我们现代圆形坐标系(度、分、秒)和时间测量(分钟和小时)的基础。 - 基于64的数字系统:偶尔也在计算中使用,使用的数字为A到Z(大写字母)、a到z(小写字母)、0到9,以及两个以上的字符,通常为+和/。 - 256字节:由计算机内部使用,实际上将8个二进制数字组合在一起。对于人类阅读,字节通常以十六进制表示。
八进制、十六进制和基于64的系统经常在计算中使用,因为它们便于作为二进制的简写形式。例如,每个十六进制数字都有一个相当于4位二进制数字的等价数字。
基数通常是自然数。但是,其他位值系统也是可能的,例如黄金分割基(其基数为非整数代数数)和负基数(其基数为负数)。
你的疑问是,当基数超过36(字母表数量+数字数量=26+10=36)时,我们是否可以将任何基数转换为任何其他基数。
以64进制为例,它使用A到Z(大写字母)(26个)、a到z(小写字母)(26个)和0到9(10个)的数字,以及另外2个字符。这样就解决了36的限制。

在64进制中,我们有(26+26+10+2)64个符号来表示数字,因此我们可以用64进制表示任何数字。同样,在更高的进制中,他们使用不同的符号来表示。

来源: http://en.wikipedia.org/wiki/Radix


3

数字系统让你可以像上帝一样创造规则。

创造规则

你需要了解的是,符号是完全任意的。并不存在一个“36之后应该是什么”的神圣规定。你可以自由定义任何你想要的规则。

要用某个进制编码数字,你只需要以下几点:

  • 基于不同进制的独特符号
  • 符号的总序数

一个任意的例子

自然地,有无限的可能性来为某个进制创建这样的符号表:

Θ
ェ
す
)
0
・
_
o
や
ι

您可以使用这个方法,将数字转换为十进制。其中,Θ代表零元素,代表一元素,依此类推。

约定

当然,如果您开始使用上面的符号表,您的同行可能会不太高兴。因为这些符号是任意的,所以我们需要约定。例如,0、1、2、3、4、5、6、7、8、9就是一个约定,十六进制、二进制等用到的符号也都是约定。通常人们会就每种进制使用什么符号表达达成共识,这也是为什么我们能读懂别人写下来的数字的原因。

1
重要的是要记住,所有数字都代表一个值。因此,如果您想这样做,您可以制作一个包含每个位置上的值的列表。在36进制之后,您只需用完可以形成逻辑序列的字符。例如,如果您使用了拥有70多个字符的柬埔寨字母表,则可以进行80进制。

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);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接