【问题标题】:Why would the method not allow inputs from 11-15?为什么该方法不允许输入 11-15?
【发布时间】:2015-02-25 06:39:37
【问题描述】:

这是Cracking the Coding Interview 5th Edition中的代码 我从 https://code.google.com/p/ctci/source/browse/trunk/Java/Introduction/CompareBinaryToHex/CompareBinaryToHex.java?spec=svn18&r=3(不想把书里几页的照片拍下来上传) 这是代码

public class CompareBinaryToHex {
    public static int digitToValue(char c) {
            if (c >= '0' && c <= '9') {
                    return c - '0';
            } else if (c >= 'A' && c <= 'F') {
                    return 10 + c - 'A';
            } else if (c >= 'a' && c <= 'f') {
                    return 10 + c - 'a';
            }
            return -1;
    }

    public static int convertToBase(String number, int base) {
            if (base < 2 || (base > 10 && base != 16)) return -1;
            int value = 0;
            for (int i = number.length() - 1; i >= 0; i--) {
                    int digit = digitToValue(number.charAt(i));
                    if (digit < 0 || digit >= base) {
                            return -1;
                    }
                    int exp = number.length() - 1 - i;
                    value += digit * Math.pow(base, exp);
            }
            return value;
    }

    public static boolean compareBinToHex(String binary, String hex) {
            int n1 = convertToBase(binary, 2);
            int n2 = convertToBase(hex, 16);
            if (n1 < 0 || n2 < 0) {
                    return false;
            } else {
                    return n1 == n2;
            }
    }

    public static void main(String[] args) {
            System.out.println(compareBinToHex("111001011", "1CB"));
    }
}

基本上这个类中的一个方法 compareBinToHex,接受二进制数和十六进制数的字符串表示形式,并返回它们是否相等(十进制值)。它使用 convertToBase 方法将该基数转换为十进制。 我的问题是 convertToBase 方法,为什么允许 2-9 和 16 范围内的基本输入,但是 11-15 的基本输入不是吗? (2-9 和 16 范围内的基本输入不会进入 return -1 if block) Gayle,作者后来总结说,最好编写更灵活和通用的代码,我同意这是推理在我支持 11-15 个基本输入的论点的背后。假设您正在使用base 11。我相信convertToBase 应该仍然可以解决这个问题,因为您计数到'A',它仍然应该在digitToValue 中的逻辑(范围'A' 到'F')后面工作。她是否有理由拒绝这些输入?

【问题讨论】:

    标签: java binary base hex


    【解决方案1】:

    因为很少有人需要基数(或radix)11、12、13、14 或 15 计算器。需要注意的是,base 8 是八进制,base 2 是二进制,base 10 是十进制,base 16 是十六进制。我会更进一步,建议您明确检查它是其中之一,

    if (base != 2 && base != 8 && base != 10 && base != 16) return -1;
    

    【讨论】:

    • 谢谢,这是有道理的。假设这个 convertToBase 方法可以用于 base 11-15。
    • 该方法适用于 11-15,是的。实际上,如果您将 f 替换为 z 并将 F 替换为 Z,它适用于不超过 36 的所有数字。这就是 Character.MAX_RADIX 为 36 的原因。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2014-03-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多