我的代码中实现了二进制String To Integer方法。问题是我在方法输出结果的最后两位数上出错了,例如:
应该是结果: 11111111100001001000101110000100
结果: 11111111100001001000101110000011
结果的最后两位数总是有问题。
非常感谢任何帮助。
代码:
public static int binaryStringToInteger (String binaryString){
char[] digits = binaryString.toCharArray();
int binaryInteger = 0;
int count = 0;
for(int i=digits.length-1;i>=0;i--)
{
if(digits[i]=='1')
{
binaryInteger +=(int)Math.pow(2, count);
}
count++;
}
return binaryInteger;
}
答案 0 :(得分:2)
你的代码没有任何问题,除了int类型只能容纳这么多。 Int保存4个字节,即8bitsx4 = 32位,第一个保留用于sign,负数为1,正数为0。 尝试使用包含64位的long int:
public static long binaryStringToInteger (String binaryString){
char[] digits = binaryString.toCharArray();
long binaryInteger = 0;
int count = 0;
for(int i=digits.length-1;i>=0;i--)
{
if(digits[i]=='1')
{
binaryInteger +=(long)Math.pow(2, count);
}
count++;
}
return binaryInteger;
}
同时检查:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
答案 1 :(得分:1)
public static long binaryStringToInteger (String binaryString){
char[] digits = binaryString.toCharArray();
long binaryInteger = 0;
long count = 0;
for(int i=digits.length-1;i>=0;i--)
{
if(digits[i]=='1')
{
binaryInteger +=(long)Math.pow(2, count);
}
count++;
}
return binaryInteger;
}
转换binaryInteger
时:
Long.toBinaryString(binaryInteger);
答案 2 :(得分:1)
我希望这个测试结果可能会有所帮助。 它向您展示了最新的内容。
binStr = 1 int = 1
binStr = 11 int = 3
binStr = 111 int = 7
binStr = 1111 int = 15
binStr = 11111 int = 31
binStr = 111111 int = 63
binStr = 1111111 int = 127
binStr = 11111111 int = 255
binStr = 111111111 int = 511
binStr = 1111111111 int = 1023
binStr = 11111111111 int = 2047
binStr = 111111111111 int = 4095
binStr = 1111111111111 int = 8191
binStr = 11111111111111 int = 16383
binStr = 111111111111111 int = 32767
binStr = 1111111111111111 int = 65535
binStr = 11111111111111111 int = 131071
binStr = 111111111111111111 int = 262143
binStr = 1111111111111111111 int = 524287
binStr = 11111111111111111111 int = 1048575
binStr = 111111111111111111111 int = 2097151
binStr = 1111111111111111111111 int = 4194303
binStr = 11111111111111111111111 int = 8388607
binStr = 111111111111111111111111 int = 16777215
binStr = 1111111111111111111111111 int = 33554431
binStr = 11111111111111111111111111 int = 67108863
binStr = 111111111111111111111111111 int = 134217727
binStr = 1111111111111111111111111111 int = 268435455
binStr = 11111111111111111111111111111 int = 536870911
binStr = 111111111111111111111111111111 int = 1073741823
binStr = 1111111111111111111111111111111 int = 2147483647
binStr = 11111111111111111111111111111111 int = -2
binStr = 111111111111111111111111111111111 int = 2147483645
binStr = 1111111111111111111111111111111111 int = -4
答案 3 :(得分:1)
您遇到转换问题:
2^31 > 2^31-1 = Integer.MAX_VALUE
因此,language specification中的以下部分介绍了从double
到int
的转换:
值必须太大(大幅度或正无穷大的正值),结果[...]是int [...]类型的最大可表示值。
因此,最后添加的值为2^31-1
而不是2^31
会导致问题。
答案 4 :(得分:0)
我认为你有一个有符号整数值的问题,所以应该按照以下方式处理适当的字符(我认为最后一个)符号位。
public static int binaryStringToInteger (String binaryString){
char[] digits = binaryString.toCharArray();
int binaryInteger = 0;
int count = 0;
for(int i=digits.length-2; i>=0;i--)
{
if(digits[i]=='1')
{
binaryInteger +=(int)Math.pow(2, count);
}
count++;
}
if(digits[digits.length-1] =='1')
{
binaryInteger *= -1 ;
}
return binaryInteger;
}
Integer.toBinaryString()也会创建一个无符号二进制字符串。