【问题标题】:How to convert 11 digit hexadecimal number to unique 11 digit decimal number in Java?如何在 Java 中将 11 位十六进制数转换为唯一的 11 位十进制数?
【发布时间】:2018-02-08 13:43:59
【问题描述】:

我们有一个非常奇怪的要求将 11 位十六进制数(范围从 (A0000000001 ~ AFFFFFFFFFF) )转换为 11 位十进制数。十六进制到整数之间应该有 1:1 的映射。有没有办法在 Java 中做到这一点?

【问题讨论】:

    标签: java data-conversion


    【解决方案1】:
    String hexNumber = ... 
    int decimal = Integer.parseInt(hexNumber, 16);
    

    不确定是否需要显示十个字符。如果是这样,这里有一些代码可以将其转换为字符串并填充前导零。

    String decNumber = Integer.toString(decimal);
    
    
    public static String padLeadingZeros(String data, int requiredLength){
        StringBuffer sb = new StringBuffer();
    
        int numLeadingZeros = requiredLength - data.length();
        for (int i=0; i < numLeadingZeros; i++){
            sb.append("0");
        }
        sb.append(data);
        return sb.toString();
    }
    

    【讨论】:

      【解决方案2】:

      这在 Java 或任何其他语言或系统中是不可能的。这种不可能性是数论和集合论的基本属性。

      由于前导 0xA 没有改变,因此您实际拥有的是 10 位十六进制数字值,或 40 位数据。

      这包含大约 1.1 x 1012 个可能的值,因此无法将其映射到 11 位十进制数,根据定义,它只有 1011可能的值。

      基于 cmets,我将更明确地说明这一点。从 0xA0000000000 开始并将其映射到十进制 00000000000,然后将两者都加 1 以在两组成员之间建立一一对应关系并重复:

      0xA0000000000 -> 00000000000
      0xA0000000001 -> 00000000001
      0xA0000000002 -> 00000000002
      ...
      0xA0000000010 -> 00000000016
      ...
      0xA0000000100 -> 00000000256
      ...
      0xA0000001000 -> 00000004096
      ...
      0xA174876E7FF -> 99999999999
      ...
      0xA174876E800 -> oops! overflow!  too many digits
      

      换句话说,0xA00000000000xAFFFFFFFFFF 之间所有十六进制值的集合的大小大于0000000000099999999999 之间所有十进制值的集合。

      【讨论】:

      • 他希望这个从 10 位十六进制映射到 11 位,A 位保持不变
      • 他明确表示十进制输出。您不能将超过一万亿个不同的值映射到 11 位数字。
      • 是的,我只是指出他只在一个范围内执行此操作,并不需要所有潜在值。
      • A0000000001 = 12094627905535 AFFFFFFFFFF = 10995116277761 Range Of Values = 1099511627774 #Of unique numbers required 13
      • @JimGarrison 正如约翰尼指出的那样,我不想将万亿不同的值映射到 11 位数字。我想要的只是上面提到的 10 位十六进制的 11 位唯一数字。
      猜你喜欢
      • 2014-04-11
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      相关资源
      最近更新 更多