我正在研究这个带有二进制字符串并将其转换为十进制的程序,使用this guide将二进制转换为十进制。当我在头脑中经历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);
}
}
}
答案 0 :(得分:3)
字符串是0基于所以你应该循环字符串从0到&lt;字符串的长度,但indexOf(...)
,不是你想要使用的,因为这将搜索小int的字符串中的位置,这是没有意义的。你不关心2的char等价物在String中的位置,或者即使它完全在String中。
相反,您希望使用charAt(...)
或subString(...)
,然后解析为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 Table
答案 1 :(得分:2)
两点:
indexOf()
与substring()
混淆。在您的情况下,binary.indexOf(i)
执行以下操作。首先,将整数i
转换为字符串。然后从左到右搜索binary
以查找与字符串值i
匹配的子字符串。第一次通过循环i==1
。这将返回零,因为1
中的索引为零的binary
。第二次,i
的值为2
。 2
中没有binary
,因此返回零。对于i==3
,您正在3
中寻找字符binary
,这永远不会成真。查看String#substring()
方法,这是我认为您的意图。