10

我正在开发这个程序,该程序采用二进制字符串并将其转换为十进制,使用本指南将二进制转换为十进制。当我在脑海中运行 for 循环时,我得到了正确的输出。然而,当我运行我的程序时,我得到了这个奇怪的输出:

1
3
7
15
31
63
127

实际输出应如下所示:

1
2
5
11
22
44
89

我这辈子都想不通。为什么我的程序会这样做?这是当前的源代码:

public class BinaryToDecimal
{
public static void main(String[] args)
{
    String binary = "1011001";
    int toMultiplyBy;
    int decimalValue = 0;
    for (int i = 1; i <= binary.length(); i++)
    {
        int whatNumber = binary.indexOf(i);
        if (whatNumber == 0)
        {
            toMultiplyBy = 0;
        }
        else
        {
            toMultiplyBy = 1;
        }
        decimalValue = ((decimalValue * 2) + toMultiplyBy);
        System.out.println(decimalValue);
        }
    }
}
4

2 回答 2

3

字符串是基于 0 的,因此您应该遍历从 0 到 < 字符串长度的字符串,但是indexOf(...), 不是您想要使用的,因为这将搜索小整数字符串中的位置,这是没有意义的。您不关心 2 的 char 等价物在 String 中的什么位置,或者即使它根本不在 String 中。

相反,您想使用charAt(...)orsubString(...)然后解析为 int。我会用

for (int i = 0; i < binary.length(); i++) {
    int whatNumber = charAt(i) - '0'; // converts a numeric char into it's int
    //...

要查看它在做什么,请创建并运行:

public class CheckChars {
   public static void main(String[] args) {
      String foo = "0123456789";

      for (int i = 0; i < foo.length(); i++) {
         char myChar = foo.charAt(i);
         int actualIntHeld = (int) myChar;
         int numberIWant = actualIntHeld - '0';

         System.out.printf("'%s' - '0' is the same as %d - %d = %d%n", 
               myChar, actualIntHeld, (int)'0', numberIWant);
      }
   }
}

返回:

'0' - '0' is the same as 48 - 48 = 0
'1' - '0' is the same as 49 - 48 = 1
'2' - '0' is the same as 50 - 48 = 2
'3' - '0' is the same as 51 - 48 = 3
'4' - '0' is the same as 52 - 48 = 4
'5' - '0' is the same as 53 - 48 = 5
'6' - '0' is the same as 54 - 48 = 6
'7' - '0' is the same as 55 - 48 = 7
'8' - '0' is the same as 56 - 48 = 8
'9' - '0' is the same as 57 - 48 = 9

表示字符的数字基于旧的 ASCII 表,该表为每个符号提供了数字表示。有关这方面的更多信息,请查看此处:ASCII 表

于 2012-09-17T01:51:03.157 回答
2

两点:

  1. 数组索引从零开始,而不是 1,所以你的循环应该是 `for (int i=0; i
  2. indexOf()substring(). 在您的情况下,请binary.indexOf(i)执行以下操作。首先,将整数i转换为字符串。然后binary从左到右搜索与 的字符串值匹配的子字符串i。第一次通过循环i==1。这将返回零,因为 中的1索引为零binary。第二次, 的i值为2。没有2in binary,所以返回零。对于i==3,您正在寻找 中的字符串3binary这永远不会是真的。

看一下String#substring()方法,我相信这就是你的意图。

于 2012-09-17T02:02:32.717 回答