【问题标题】:Why am i getting the wrong output为什么我得到错误的输出
【发布时间】:2012-04-26 10:34:01
【问题描述】:

我编写了一个程序,使用以下代码将十六进制数转换为等效的二进制形式,但我得到了错误的结果。代码如下:

public String convert(String num){
    String res="";
    int []hex={0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111};
    int i;
    char ch;
    for(i=0;i<num.length();i++)
    {
        ch=num.charAt(i);
        if(ch>='a' && ch<='f'){
            res+=hex[ch-97+10]+"";
        }
        else if(ch>='A' && ch<='F'){
            res+=hex[ch-65+10]+"";
        }
        else if(ch>='0' && ch<='9'){
            int d=ch-48;
            res+=hex[d]+"";
        }
    }
    return res;
}

如果我将样本输入设为“12ae”,那么我将得到相应的输出为“1810101110”。 仅当输入字段中有数字并且仅适用于所有字符时才会发生(出错)。但是当我将名为 hex 的数组更改为 String 类型时,它给了我确切的答案。

是因为编译器将整数数组中的数字视为某种形式的八进制数还是因为其他一些原因?

【问题讨论】:

    标签: java string hex int


    【解决方案1】:

    0010 这样的数字被解释为八进制数。写0010和写8是一样的。

    您可以使用Integer.binaryString 转换为二进制字符串。

    【讨论】:

    • 我也使用过,但我想将每个十六进制数字表示为二进制形式的 4 位数字,所以我不得不省略该方法(因为它没有提供最多 4 位数字的转换)。
    【解决方案2】:

    您在八进制数字的正确轨道上。以下声明:

    int []hex={0000,0001,0010,0011,0100,0101,0110,0111,1000,...};
    

    声明一个整数数组,在单词中,将是

    zero
    one
    eight
    nine
    sixty-four
    sixty-five
    seventy-two
    seventy-three
    one thousand
    

    等等。这显然不是你想要的。如果您将hex 声明为String[] hex,并使用"0000","0001",...,那么您将得到预期的答案。

    【讨论】:

    • 感谢您帮助我解决 Greg
    【解决方案3】:

    如果你这样写:

    int []hex={0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111};
    

    那么Java当然不会自动知道这些应该被解释为二进制数。

    0 开头的整数文字被解释为八进制数。以19 开头的整数文字被解释为十进制数字。

    如果您使用的是 Java 7,则可以对二进制数使用新的 0b 语法:

    int[] hex ={ 0b0000, 0b0001, 0b0010, 0b0011, ..., 0b1111 };
    

    否则,使用十进制或十六进制:

    int[] hex = { 0, 1, 2, 3, 4, ..., 15 };
    int[] hex = { 0x0, 0x1, 0x2, 0x3, ..., 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
    

    但由于这些只是从 0 到 15 的数字,因此您甚至根本不需要数组:因为 hex[i] == i,您可以直接使用 i 而不是 hex[i]

    【讨论】:

      【解决方案4】:

      8 以下的数字被视为八进制,顺便说一下,如果它们不被视为八进制,0001 将被更改为 1,0101 将被更改为 101,因此您将丢失二进制格式所需的零。

      顺便说一句,你可以这样做:

      int value = Integer.parseInt(hex, 16);
      String binary = Integer.toBinaryString(value);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2018-01-21
        • 2021-11-18
        • 2021-11-12
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多